初学python:希尔排序-ShellSort

代码演示

# /usr/bin/python
# -*- coding:utf-8 -*-

sample = [3, 7, 15, 6, 4, 2, 8]

L = len(sample)

while True:
    L = L/2
    k = 0
    #将序列分成L个子序列
    for k in range(0, L):
        i = k + L
        while i < len(sample):
            j = i
            while j > k:
                if sample[j] < sample[j - L]:
                    Temp = sample[j - 1]
                    sample[j - 1] = sample[j]
                    sample[j] = Temp
                else:
                    break
                j = j - L 

            i = i + L
    if L == 1:
        break

代码解释:

最外层for循环表示序列被分为L个子序列,每个子序列都需要进行单独排序;
从第14行while开始,内部都是插入排序内容;
第14行while表示每个子序列有m个元素,根据插入排序算法:
第一次,第二个元素先比较
第二次,第三个元素和前面元素比较


第m-1次,第m个元素和前面元素比较
如代码,L = L/2,每个子序列有2个元素,第二元素比较,i 第二次累加,即跳出while;L = L/4,每个子序列有4个元素,后面3个元素比较后,i 第四次累加,即跳出循环

        while i < len(sample):
            ...
            ...
            i = i + L

第二个while循环,i 不断累加,将每次累加后的初始值赋给 j ,第一次累加,第二个元素和前面元素比较;第二次累加,第三个元素和前面元素比较,j 最多累减两次,刚好第三个元素最多比较两次;第三次累加,第四个元素和前面元素比较。。。

            j = i
            while j > k:
                if sample[j] < sample[j - L]:
                    Temp = sample[j - 1]
                    sample[j - 1] = sample[j]
                    sample[j] = Temp
                else:
                    break
                j = j - L 
            i = i + L
发布了37 篇原创文章 · 获赞 2 · 访问量 7625

猜你喜欢

转载自blog.csdn.net/bingozb/article/details/98629860