希尔排序

希尔排序

描述:

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。是将整个序列分割成若干小的子序列分别进行插入排序

原理:

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

时间复杂度:

最优时间复杂度:根据步长序列的不同而不同
最坏时间复杂度:O(n2)

稳定性:

不稳定

由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。

希尔排序演示:

代码实现:

简洁版:

def Shell_sort(L):
    n = len(L)
    step = len(L) // 2
    while step > 0:
        for i in range(step, n):
            while i >= step and L[i] < L[i - step]:
                L[i], L[i - step] = L[i - step], L[i]
                i -= step
        step //= 2
    return L
View Code

注释版:

def shell_sort(L):
    n = len(L)
    step = len(L) // 2
    while step > 0:
        for i in range(step, n):
            while i >= step and L[i] < L[i - step]:
                L[i], L[i - step] = L[i - step], L[i]
                i -= step

        step //= 2
    return L

# 最一层循环控制所有步长的情况, 如果步长大于0, 即: 步长大于等于1, 则执行循环体
# 第二层循环控制一个步长的情况, 一个步长分N多个序列
# 第三层循环控制一个序列, 在这个序列内, 执行直接插入排序的代码, 如果当前元素小于前驱元素, 则交换位置, 然后前移, 再次比较
# 执行完一个步长后, 步长减半继续执行, 直到步长大于等于1

if __name__ == "__main__":
    l = list(i for i in range(0, 100000))
    print("洗牌之前的列表:" + str(l))
    random.shuffle(l)
    print("洗牌之后的列表:" + str(l))
    print("希尔排序之后:" + str(shell_sort(l)))
View Code
原文地址:https://www.cnblogs.com/amou/p/9036960.html