希尔排序是对插入排序的改进,是递减增量排序算法。
基本思想
- 将整个待排序的记录序列分割为若干子序列分别进行直接插入排序
- 其中的子序列不是逐段分割的,而是相隔特定的增量的子序列。
- 选择更小的增量,将数组分割成多个子序列进行排序
- 最后,选择增量为1,对全体记录进行直接插入排序。
增量选择
在每一趟的排序过程中,都有一个增量,至少满足一个规则:
增量关系:d[1]>d[2]>d[3]……>d[t]=1(t趟排序)
建议采用:首选增量为n/2,每次增量为原先的1/2,直到增量为1.
算法实例
性能分析
- 平均时间复杂度:o(N^1.3),大量数据研究表明在o(N^1.3)附近,事实上也不是严格论证的结果
- 最好时间复杂度:仍然和增量序列的选取有关
- 最坏时间复杂度:o(N^2)
- 空间复杂度:o(1)
- 稳定性:不稳定,例如待排序列(3,2,2,1),取时,显然就能看出是不稳定的
python代码
def shellsort(self,nums:list):
length = len(nums)
step = int(length/2)
while step > 0: #
for j in range(0,length):
if j + step < length:
if nums[j] > nums[j + step]:
nums[j], nums[j + step] = nums[j + step],nums[j]
step = int(step/2)
for i in range(1,length):
key = nums[i]
j = i - 1
while j >= 0 and nums[j] > key:
nums[j + 1] = nums[j]
j = j - 1
nums[j + 1] = key
return nums