插入排序,希尔排序

# -*- coding: utf-8 -*-
"""
Created on Sun Nov 18 13:28:49 2018

"""
#插入排序难点
插入排序(英语:Insertion Sort)是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
'''
def insert_sort(alist):
    n=len(alist)
    for j in range(1,n):
        i=j
        while i>0:   #重点在交换后继续比较
            if alist[i]<alist[i-1]:
                alist[i],alist[i-1] = alist[i-1],alist[i]  #i下标的数据前一个数据交换,但是i不变。i所在的位置的数据变了
                i-=1 #这儿的减一重点理解,可以举一个列子比较容易理解
            else:
                break
alist=[3,2,6,1.5,1]
#对i-=1的解释,比如i=3,此时alist[3]=1.5, alist[3]<alist[3-1]=alist[2]=6,
交换alist[3],alist[2] = alist[2],alist[3]   交换后 [3,2,1.5,6,1]  此时i-=1后  i=2,alist[2]是较小的那一个,由于i=2>0,然后继续循环
alist[i]<alist[i-1]  一次向前比较


insert_sort(alist)
print(alist)
'''

#希尔排序
'''
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。
最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。
'''
def shell_sort(alist):
    n = len(alist)
    #初始步长
    gap = n//2
    
    while gap>0:
        #按步长进行排序
        for i in range(gap,n):
            j = i
        #插入排序
            while j>=gap and alist[j-gap]>alist[j]:
                alist[j-gap],alist[j] = alist[j],alist[j-gap]
                j -=gap
            
        gap=gap//2
        
alist = [54,26,93,17,77,31,44,55,20]
shell_sort(alist)
print(alist)

猜你喜欢

转载自blog.csdn.net/qq_35810838/article/details/84502312
今日推荐