插入排序就好像我们打扑克牌的时候对扑克牌进行换序,前面的已经排好序了,后面的需要往前面排好序的队列中插入,但是程序无法直接插入到两个索引的中间,所以插入新的一张牌的时候,不断比较的同时,需要不断地将那些已经比较完成的元素向右移,以此给要插入的元素腾出空间。下面是我已经编号的一个程序,它的错误在于比较的同时没有及时的向右移,妄图找好位置后一步到位
def insertsort2(alist):
for index in range(1,len(alist)):
currentvalue=alist[index]
pos=index
while pos>0 and currentvalue<alist[pos-1]:
pos=pos-1
alist[pos],alist[index]=alist[index],alist[pos]
alist=[1,4,2,5,3]
insertsort2(alist)
[1, 2, 3, 5, 4]
这种程对1,4,2,5,3排序就会造成上面的结果
def insertSort(alist):
for index in range(1,len(alist)):
currentvalue=alist[index]
position=index
while position>0 and alist[position-1]>currentvalue:
alist[position]=alist[position-1]#这是一个不断将元素进行右移的过程,因为不断地将左面的值放在右面的位置
position=position-1
alist[position]=currentvalue
接下来介绍希尔排序,希尔排序是插入排序的一种变形,插入排序从第二个数开始,每一个数都跟前一个数进行比较,,如果发生逆序,就进行调换。但是这种排序方法对于大规模乱序数组排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从列表的一端移动到另一端。希尔排序的思想是使得数组中任意间隔为h的数组都是有序的。假设h为2,就是说只要保持第1,3,5,7,9个数或者第2,4,6,7,8个数是有序的就可以,我们经过这样的初步排序,再缩小h,将h缩小为1,则希尔排序就退化普通的插入排序。注意无论我们最先选择的h是多大,最后一定要缩小到h=1,否则的话就有可能产生诸如[1,4,3,9,5]这样的情况。至于它的代码,只要将插入排序中的1改成gap,在加上一个关于gap的循环即可。希尔排序并不能减小比较的次数,只不过他有可能减小移动的次数,从而加快排序速度。
def shell_sort(alist):
gap=len(alist)//2
while gap>0:
for index in range(gap,len(alist)):
current_value=alist[index]
position=index
while position>0 and alist[position]<alist[position-gap]:
alist[position],alist[position-gap]=alist[position-gap],alist[position]
position-=gap
gap=gap//2