排序算法之希尔排序

一、原理

 希尔排序算法是一种分组插入排序算法,是插入排序的一种更高效的改进版本,希尔排序使整体的数据越来越接近有序。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;

希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

算法步骤:

(1)首先取一个整数d1=n/2(n表示序列长度len(n)),将元素分为d1个组,每组相邻量元素之间距离为d1,在各组内进行直接插入排序;

(2)取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。

排序算法之希尔排序

接着按照d2=d1/2=3/2=1进行分组插入排序。

二、实现

实现只需要在插入排序的基础之上做一些修改即可:

def insert_sort_gap(li,gap):

    for i in range(1,len(li)): #对无序区的元素进行循环,i表示第一个元素的下标,因为有序区已经有一个元素了
        temp=li[i] #将无序区取出的元素进行保存
        j=i-gap #是有序区的gap位置下标
        while j>=0 and li[j]>temp:
            li[j+gap]=li[j] #将有序区的元素向后移动,因为从无序区已经取出一个元素,空了一个位置
            j-=gap #有序区的元素继续向前循环比较

        #将无序区的元素插入到有序区
        li[j+gap]=temp

def shellSort(li):
    d=len(li)//2
    while d>0:
        insert_sort_gap(li,d)
        d=d//2
li=[2,5,8,3,1,9,0]
shellSort(li)
print(li)#[0, 1, 2, 3, 5, 8, 9]

参考:https://github.com/hustcc/JS-Sorting-Algorithm/blob/master/4.shellSort.md