概念
希尔排序又称缩小增量排序,是插入排序的一种,它是针对直接插入排序算法的改进。它通过比较相距一定间隔的元素来进行,先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序,直到只比较相邻元素的最后一趟排序为止。
适用说明?
希尔排序时间复杂度是?,空间复杂度为常数阶?。希尔排序没有时间复杂度为 ?的快速排序算法快 ,因此对中等大小规模表现良好,但对规模非常大的数据排序不是最优选择,总之比一般 ?复杂度的算法快得多。
?过程图示
希尔排序目的为了加快速度改进了插入排序,交换不相邻的元素对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。在此我们选择增量 ,缩小增量以 ?的方式,用序列 ?来表示。
第一趟,初始增量?
第二趟,增量缩小为 2?
第三趟,增量缩小为 1,得到最终排序结果?
算法分析
时间复杂度
当一开始为顺序时,效率最高,时间复杂度最好,为??;当一开始为逆序时,效率最低,时间复杂度最坏,为?。希尔排序的时间复杂度是取决于增量的选取,用预不同的序列,时间复杂度可能不同,较快完成排序的平均时间复杂度为 。
空间复杂度
空间复杂度就是在交换元素时那个临时变量所占的内存空间,所以空间复杂度为?。
稳定性
希尔排序需要进行多次插入排序,在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。??
实例代码?
def shellSort(arr):
n = len(arr)
gap = int(n/2)
while gap > 0:
for i in range(gap,n):
temp = arr[i]
j = i
while j >= gap and arr[j-gap] >temp:
arr[j] = arr[j-gap]
j -= gap
arr[j] = temp
gap = int(gap/2)
arr = [ 12, 34, 54, 2, 3]
n = len(arr)
print ("排序前:")
for i in range(n):
print(arr[i])
shellSort(arr)
print ("\n排序后:")
for i in range(n):
print(arr[i])
|