希尔排序是采用了不同步长的插入排序。插入排序的步长是1。
一个数组可以分成三部分,前面已排序的序列a,当前数i,后面未排序的序列b
i 从 a最后一个元素 开始往前依次插入 比 i 大的 元素的前面。
插入排序:
array=[7,7,4,1,10,6,3,65,8,9,20,15]
def insertSort(ary):
N=len(ary)
for i in range(N):
#前i-1个元素是有序的,将第i个元素从后往前插入i-1个元素中
for j in range(i,0,-1):
if ary[j]<ary[j-1]:
ary[j],ary[j-1]=ary[j-1],ary[j]
return ary
ary2=insertSort(array)
print (ary2)
希尔排序:
#希尔排序
def shellSort(nums):
# 设定步长
step = int(len(nums)/2)
print(step)
while step > 0:
for i in range(step, len(nums)):
# 类似插入排序, 其实这个step就相当于插入排序里面step=1
#当前值与指定步长之前的值比较, 符合条件则交换位置
while i >= step and nums[i-step] > nums[i]:
nums[i], nums[i-step] = nums[i-step], nums[i]
i =i-step#将当前最小的与前面的相比较,插入排序里面用for循环代替了
step = int(step/2)
return nums
ary2=shellSort(array)
print (ary2)