数据结构与算法(快速排序,希尔排序)
2020-03-08 11:43
701 查看
快速排序
快速排序(英语:Quicksort):
- 从数列中挑出一个元素,称为"基准"(pivot)
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
def quick_sort(alist, start, end): """快速排序""" # 递归的退出条件 if start >= end: return # 设定起始元素为要寻找位置的基准元素 mid = alist[start] # low为序列左边的由左向右移动的游标 low = start # high为序列右边的由右向左移动的游标 high = end while low < high: # 如果low与high未重合,high指向的元素不比基准元素小,则high向左移动 while low < high and alist[high] >= mid: high -= 1 # 将high指向的元素放到low的位置上 alist[low] = alist[high] # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动 while low < high and alist[low] < mid: low += 1 # 将low指向的元素放到high的位置上 alist[high] = alist[low] # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置 # 将基准元素放到该位置 alist[low] = mid # 对基准元素左边的子序列进行快速排序 quick_sort(alist, start, low-1) # 对基准元素右边的子序列进行快速排序 quick_sort(alist, low+1, end) alist = [54,26,93,17,77,31,44,55,20] quick_sort(alist,0,len(alist)-1) print(alist)
时间复杂度
最优时间复杂度:O(nlogn)
最坏时间复杂度:O(n2)
稳定性:不稳定
希尔排序
希尔排序(Shell Sort)
def shell_sort(alist): n = len(alist) # 初始步长 gap = n / 2 while gap > 0: # 按步长进行插入排序 for i in range(gap, n): j = i # 插入排序 while j>=gap and alist[j-gap] > alist[j]: alist[j-gap], alist[j] = alist[j], alist[j-gap] j -= gap # 得到新的步长 gap = gap / 2 alist = [54,26,93,17,77,31,44,55,20] shell_sort(alist) print(alist)
时间复杂度
最优时间复杂度:根据步长序列的不同而不同
最坏时间复杂度:O(n2)
稳定想:不稳定
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 数据结构与算法从零开始系列:冒泡排序、选择排序、插入排序、希尔排序、堆排序、快速排序、归并排序、基数排序
- 数据结构之进阶排序(希尔排序、快速排序、归并排序)
- java数据结构与算法-高级排序-希尔排序
- {希尔排序、快速排序、动态数组、单链表、字符串转整型}大综合
- C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序
- 读取文件内的数据(数字)并进行三种排序,1(快速排序)2(归并排序)3(希尔排序)。
- 第十六周上机实践—项目1(2)—验证算法 希尔排序 快速排序
- 已完成以下算法:冒泡排序,插入排序,希尔排序,快速排序,基数排序
- 数据结构与算法之高级排序(快速/归并)<十二>
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
- 数据结构与算法之快速排序
- 【DAY.8】PHP数据结构与算法_排序_希尔排序
- 七大内部排序算法总结(插入排序、希尔排序、冒泡排序、简单选择排序、快速排序、归并排序、堆排序)
- 基本的排序算法:冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序
- 快速排序、堆排序、希尔排序实现
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 排序算法 - 快速插入排序和希尔排序
- 第十六周 项目1 验证算法 希尔排序 快速排序
- 快速排序 归并排序 堆排序 希尔排序
- 冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序六大排序大总结