八大排序算法的Python实现__5__希尔排序

个人技术博客地址:http://songmingyao.com/


原理

  • 为插入排序的优化
  • 对要排序的列表根据一定间隔(初始间隔一般设为列表长度的一半)进行分组
  • 对各列表之间相同位置(下标)的元素进行插入排序
  • 间隔减半,再次分组并对各列表之间相同位置(下标)的元素进行插入排序
  • 如此循环,最终间隔为1,即为正常的插入排序

源码

def shell_sort(l):
    n = len(l)
    # 初始间隔
    gap = n//2

    while gap > 0:
        for i in range(gap, n):
            for j in range(i, gap-1, -gap):
                if l[j] < l[j-gap]:
                    l[j], l[j-gap] = l[j-gap], l[j]
                else:
                    break
        gap //= 2


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

时间复杂度

  • 最优时间复杂度(初始间隔为列表长度一半时):O(nlogn)
  • 最坏时间复杂度:O(n2)
  • 稳定性(多个元素等值的情况下是否会破坏原有顺序):不稳定
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 该系列文章主要是记录下自己暑假这段时间的学习笔记,暑期也在实习,抽空学了很多,每个方面的知识我都会另起一篇博客去记...
    Yanci516阅读 14,220评论 6 19
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,590评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,086评论 0 15
  • 转载请注明出处:http://egoistk21.xyz/2016/09/10/Java排序算法专题/ 今天晚上做...
    EGOISTK21阅读 8,521评论 13 69
  • 秋日莫愁湖畔,探访莫愁路小学,感悟到真的有一种教育叫莫愁教育,让人在快乐中启迪! 莫愁教育魅力之一:教师有趣...
    慧阿李阅读 5,998评论 0 0