排序算法(python)-希尔排序
- 插入排序是希尔排序的一种特殊情况,当希尔排序的初始步长为1时,即为插入排序。缩小增量排序 希尔排序是非稳定排序算法
- 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
过程
假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序
13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10
然后我们对每列
进行排序:
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45
[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]
这时10已经移至正确位置了,然后再以3为步长进行排序:
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45
排序之后变为:
10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94
最后以1步长进行排序(此时就是简单的插入排序了)
例子:
对于一个int数组,请编写一个希尔排序算法,对数组元素排序。
给定一个int数组A及数组的大小n,请返回排序后的数组。保证元素小于等于2000。
测试样例:
[1,2,3,5,2,3],6
[1,2,2,3,3,5]
-- coding:utf-8 --
class ShellSort:
def shellSort(self, A, n):
# write code here
gap = n/2
while gap > 0:
for j in xrange(gap,n):
i = j
while i > 0:
if A[i] < A[i-gap]:
A[i], A[i-gap] = A[i-gap], A[i]
i -= gap
else:
break
gap /= 2
return A
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by xuehz on 2017/8/23
def shell_sort(alist):
n = len(alist)
gap = n / 2 #python3 n // 2
# gap 变化到0之前 插入算法执行到次数
while gap > 0:
#与普通的插入算法区别 gap步长 按步长进行插入排序
for j in xrange(gap,n):
i = j
#插入排序
while i > 0: # 内部循环 与前部分比较 一直到最前端
if alist[i] < alist[i-gap]:
alist[i], alist[i-gap] = alist[i-gap], alist[i]
i -= gap
else:
break
# 缩短步长
gap /= 2
return alist
if __name__ == '__main__':
li = [52,32,98,07,67]
print li
print shell_sort(li)
时间复杂度
- 最优时间复杂度:根据步长序列的不同而不同
- 最坏时间复杂度:O(n2)
- 稳定想:不稳定