希尔排序(python实现)

希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。 

def shell_sort(alist):
    """
    希尔排序
    :param alist:
    :return:
    """
    n = len(alist)
    gap = n // 2
    while gap >= 1:
        # j是需要比较的次数
        for j in range(gap, n):   # 3---7
            # i 是需要控制的索引
            i = j
            # 比较的逻辑和控制i的变换的逻辑
            while (i - gap) >= 0:
                if alist[i] < alist[i-gap]:
                    # 交换
                    alist[i], alist[i-gap] = alist[i-gap], alist[i]
                    # 修改i
                    i -= gap
                else:
                    break
        # 控制间隙的变化
        gap //= 2


if __name__ == '__main__':
    li = [6, 7, 5, 3, 4, 1, 8]
    shell_sort(li)
    print(li)

希尔排序是首先将传入的列表分为(列表长度//2)段, 此案例分为2段,用第二段的第一个数b与第一段第一个a数比较大小, 如果b<a, 那么将a和b换位置,继续循环后将用第二段的第二个数d与第一段第二个c数比较大小以此类推…

全部循环之后再将列表按照(上次分割的短数//2)段,此案例分为1段,也就是变成了一个依旧不是规律的数组,最后进行插入排序

点赞