插入排序-shell排序

shell排序

这个系列是回顾之前所学,是用python商量着完成的。

路过的大佬就当看个乐,实现算法的方式不一,也有讨巧的做法。

我只讲讲我的思路,希望大家浏览的时候能多多提建议,共同学习共同进步。

--------------------------------------------------------------------------------------------------------

shell排序基本思想:
shell是插入排序的一种高效改进版本,shell排序是不稳定排序算法,该算法由shell在1959年提出而命名,属于比较早的算法之一。


shell排序是把记录按下标的一定增量分组,将其称之为gap,对每组使用直接插入排序算法
每一次分组排序完成,gap都会除以2并向下取整,对更细分的分组进行直接插入排序
直至gap为1,整个文件恰被分成一组,算法便终止。

但就我所理解的,当每次分组完成,比较的永远是每个分组对应下标的值

比如: [2, 4,  5, 1,   3]

其中2、5、3的下标都为0,gap为2,比较的时候就比较它们三个的值,根据降序交换位置

随着gap的减小,整个序列的排序愈发明显

为1时,刚好排完

以下是具体实现:

def shell_sort(list):
    gap = len(list) // 2
    # 1.首先确定一下,第一次gap的值
    # 6.gap是要大于等于1的,一般到1就基本ok了
    while gap >= 1:
        for i in range(gap, len(list)):
            # 2.这里为什么要设置成len(list),这是防止出现序列是奇数的情况,如果这里是gap的倍数那么会落下最后一个值取不到的情况
            # 3.这里为啥要从gap开始取值,因为我们是要比较不同组同下标的值嘛
            # 5.所以这里是不是还要有一个循环呀? i不能等于0,避免out of range
            while i > 0:
                if list[i] < list[i-gap]:
                    # 4.比较大小,这里没什么好讲的
                    list[i], list[i-gap] = list[i-gap], list[i]
                else:
                    break
                    # 5.这里会存在一个问题,就是如何确保比较的值一定比前面的值大还是小?
                    # 5.所以我们还是需要拿当前的值去比较前面的值大小,这里就需要迭代一下
                    i -= gap
        # 6.那每一次的分组排序完成,我们就需要改变gap值的大小
        gap //= 2
    return list

 以上,接下来实现一下直接插入排序

原文地址:https://www.cnblogs.com/PurpleRain98/p/13588492.html