数据科学家成长之旅

关注 机器学习,深度学习,自然语言处理,数学

排序算法(4)——希尔排序

__author__ = 'steven'
# coding=utf-8

'''希尔排序
    希尔排序的实质就是分组插入排序,该方法又称*缩小增量(step)排序*,因DL.Shell于1959年提出而得名。
    希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。
    希尔排序是基于插入排序的以下两点性质而提出改进方法的:
        1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
        2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位

    “比较”在希尔排序中是最主要的操作,而不是“交换”。用这样步长串行的希尔排序比插入排序和堆排序都要快,
    甚至在小数组中比快速排序还快,但是在涉及大量数据时希尔排序还是比快速排序慢。

    平均时间复杂度为:O(nlogn)
    希尔排序是非稳定排序算法。
'''

# list = [8,7,6,5,4,13,2,1]
list = [5, 8, 1, 4, 2, 7, 3, 6]
# list_ascended = [1, 2, 3, 4]
# list_descended = [5, 4, 3, 2]

def shell_sort(list):
    step = len(list) // 2
    while step > 0:
        # print("step=%d"%step)
        # print(list)
        for i in range(step, len(list)):
            # 类似插入排序, 当前值与指定步长之前的值比较, 符合条件则交换位置
            while i >= step and list[i - step] > list[i]:
                list[i], list[i - step] = list[i - step], list[i]
                i -= step    # 这里类似插入排序要逐步向前比较插入,每次跳过step的步长
            # print(list)
        step //= 2

    return list

print(shell_sort(list))

posted on 2017-03-04 19:57  会飞的蝸牛  阅读(233)  评论(0编辑  收藏  举报

导航