希尔排序_python
Posted 霍同学笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了希尔排序_python相关的知识,希望对你有一定的参考价值。
这是我之前自己写的希尔排序
import mathdef shellsort(array): increment = len(array) while increment > 1: #当型循环 increment = int(increment/3) + 1 #设置增量 for i in range(len(array)) : #在每一轮的大循环中进行遍历循环 j = i + increment if j < len(array) : #如果j取值超过数组长度,就退出循环 temp = array[j] #哨兵 while ((j-increment)>=0) and \ (array[j-increment]>temp): array[j] = array[j-increment] j-=increment array[j]=temp else: breakarray = [84,83,88,87,61,50,70,60,80,99]print('原数组为:'+str(array))shellsort(array)print('希尔排序后:'+str(array))
今天我在回忆时忘记了之前自己是怎么写的,于是看网上的代码
def shellsort(arr):
n =len(arr)
gap=n // 2
while gap > 0:
for i in range(gap,n):
j =i
while j>=gap and arr[j-gap]>arr[j]:
arr[j-gap],arr[j]=arr[j],arr[j-gap]
j-=gap
gap=gap // 2
arr=[7,8,6,5,4,3,2,1,0]
print('排序前:'+str(arr))
shellsort(arr)
print('排序后:'+str(arr))
我发现我没有理解希尔排序的本质,它是一种直接插入排序的升级,直接插入的重要一步就是设定哨兵后的数值比较——用哨兵和哨兵之前的数值进行比较。
换个方式表达,我可以提出一个问题:为什么第7行不用arr[j+gap]<arr[j]:而是用arr[j-gap]>arr[j]:??因为直接插入排序待插入的元素需要和它自己坐标之前的数值进行比较,而非之后。
总的来说,不管具体怎么实现,希尔排序是在直接插入排序的基础上进行的。
以上是关于希尔排序_python的主要内容,如果未能解决你的问题,请参考以下文章