【数据结构与算法Python实践系列】5分钟学会经典排序算法-希尔排序

希尔排序

希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

  • 时间复杂度O(N*logN)
  • 空间复杂度O(1)
  • 不稳定排序:比如一个待排序数组5115,当我们选择步长为2开始排序,第一位置上的5和第二个位置上的1交换,得到1155,2个1的顺序变换了,破坏了数据的稳定性。

算法原理

希尔排序是改良的插入排序对插入步长进行了调整,插入排序步长为1,希尔排序的步长是从大到小调整的;首先将要排序数组数按某个增量d分成若干份,每组中记录的下标相差d,对每组进行插入排序,然后再减小d的取值,再次分组,重复以上过程直至,分成若干组最终以步长为1的插入排序结束,整个数组的排序完成。

希尔排序算法中即体现了插入排序在有序度高的序列中排序的高效性又综合了分治法缩小插入排序的数据规模的优势。

希尔排序中的关键是各次迭代所引用的增量,增量序列的步长增长性影响扫描次数,而扫描次数影响逻辑组内元素规模,逻辑组规模及逻辑组有序度影响插入操作次数,因而增量序列的选择对希尔排序的时间复杂度起决定性影响。

Python实现

示例代码首次选取数据集长度的一半为增量序列步长,以后每次减半,直到增量为1。​

def shell_sort(arr):

    def inster_sort(arr, gap):
        for i in range(gap, len(arr)):
            index = i
            data = arr[i]
            while index > gap and arr[index - 1] > data:
                # 移动基础 列表,确定要插入的位置
                arr[index] = arr[index - 1]
                index -= 1
            arr[index] = data
        return arr

    # def inster_sort(arr, gap):
    #     for i in range(gap, len(arr)):
    #         index = i
    #         data = arr[i]
    #         while index >= gap and arr[index - gap] > data:
    #             # 移动基础 列表,确定要插入的位置
    #             arr[index] = arr[index - gap]
    #             index -= gap
    #         arr[index] = data
    #     return arr

    gap = len(arr)

    while gap > 0:
        gap = gap // 2
        inster_sort(arr, gap)
    return arr


if __name__ == "__main__":
    print(shell_sort([45, 32, 8, 33, 12, 22, 19, 97]))

猜你喜欢

转载自blog.csdn.net/qq_23934063/article/details/106846787
今日推荐