Python插入排序(2)

Python代码:

"""
插入排序(2)希尔排序、Shell排序

1)确定初始步长
2)按步长将待排序的数进行分组
3)每个分组采用直接插入排序
不断缩小步长,当步长缩小为1时,排序结束。

步长的缩小规律如下:
N / 2 = n1
n1 / 2 = n2
n2 / 2 = n3
....
当n变成1时,被分为1组,算法终止

"""

# 希尔排序
def shellSort(lst):
    s = len(lst)//2 # 初始步长,地板除获取整数部分
    while s >= 1:
        for i in range(0, s): # 步长s,即可以分为s个数组
            sublist = []
            j = i
            while j<len(lst): # 生成各分组的数
                sublist.insert(0, lst[j])
                j = j+s
            sublist = insertSort(sublist) # 各分组直接插入排序
            j = i
            for k in range(len(sublist)): # 对各分组的数排序
                lst[j] = sublist[k]
                j = j+s
        s = s//2 # 缩小步长
        print("希尔排序后:%s" % lst)


# 直接插入排序
def insertSort(lst):
    for i in range(1,len(lst)): # 未排序的数组
        #
        for j in range(i): # 已排序的数组(初始假设第一个数已排序)
            if lst[i] <= lst[j]:
                lst.insert(j, lst[i])
                lst.pop(i+1)
                break
    return lst

if __name__ == "__main__":
    lst = [3, 6, 9, 1, 4, 7, 2, 8, 5, 0]
    print("排序前: %s\r\n" %lst)
    shellSort(lst)
    print("\r\n排序后: %s" % lst)

输出结果:

E:\python\algorithm>python3 insertSort2.py
排序前: [3, 6, 9, 1, 4, 7, 2, 8, 5, 0]

希尔排序后:[3, 2, 8, 1, 0, 7, 6, 9, 5, 4]
希尔排序后:[0, 1, 3, 2, 5, 4, 6, 7, 8, 9]
希尔排序后:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

排序后: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

=====结束=====

posted @ 2018-01-29 15:06  sam11  阅读(160)  评论(0编辑  收藏  举报