数据结构与算法笔记(十)—— 快速排序
什么是快速排序
快速排序(英语:Quicksort),又称为交换排序,通过一趟排序将要排序的数据分割为 独立的两部分。假设要排序的列表是 A[0]……A[N-1],首先任意选取一个数据(通常选用 列表的第一个数)作为基准数据,然后将所有比它小的数都放到它左边,所有比它大的数都 放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算 法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
步骤
设置两个变量 low、high,排序开始的时候:low=0,high=N-1;
以第一个列表元素作为基准数据,赋值给 mid,即 mid=A[0];
从 high 开始向前搜索,即由后开始向前搜索(high–),找到第一个小于 mid 的值 A[high],将 A[hight]和 A[low]的值交换;
从 low 开始向后搜索,即由前开始向后搜索(low++),找到第一个大于 mid 的 A[low],将 A[low]和 A[high]的值交换;
重复第 3、4 步,直到 low=high;
快速排序的演示
时间复杂度
- 最优时间复杂度:O(nlogn)
- 最坏时间复杂度:O(n2)
- 稳定性:不稳定
从一开始快速排序平均需要花费O(n log n)时间的描述并不明显。但是不难观察到的是分区运算,数组的元素都会在每次循环中走访过一次,使用O(n)的时间。在使用结合(concatenation)的版本中,这项运算也是O(n)。
在最好的情况,每次我们运行一次分区,我们会把一个数列分为两个几近相等的片段。这个意思就是每次递归调用处理一半大小的数列。因此,在到达大小为一的数列前,我们只要作log n次嵌套的调用。这个意思就是调用树的深度是O(log n)。但是在同一层次结构的两个程序调用中,不会处理到原来数列的相同部分;因此,程序调用的每一层次结构总共全部仅需要O(n)的时间(每个调用有某些共同的额外耗费,但是因为在每一层次结构仅仅只有O(n)个调用,这些被归纳在O(n)系数中)。结果是这个算法仅需使用O(n log n)时间。
代码实现
def quick_sort(alist, start, end):"""快速排序"""# 递归的退出条件if start >= end:return# 设定起始元素为要寻找位置的基准元素mid_value = alist[start]# low 为序列左边的由左向右移动的游标low = start# high 为序列右边的由右向左移动的游标high = endwhile low < high:# 如果 low 与 high 未重合,high 指向的元素不比基准元素小,则 high 向左移动while low < high and alist[high] >= mid_value:high -= 1# 将 high 指向的元素放到 low 的位置上alist[low] = alist[high]# 如果 low 与 high 未重合,low 指向的元素比基准元素小,则 low 向右移动while low < high and alist[low] < mid_value:low += 1# 将 low 指向的元素放到 high 的位置上alist[high] = alist[low]# 退出循环后,low 与 high 重合,此时所指位置为基准元素的正确位置# 将基准元素放到该位置alist[low] = mid_value# 对基准元素左边的子序列进行快速排序quick_sort(alist, start, low-1)# 对基准元素右边的子序列进行快速排序quick_sort(alist, low+1, end)if __name__ == '__main__':li = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10]print(li)quick_sort(li,0,len(li)-1)print(li)
结果:
[13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 27, 73, 25, 39, 10]
[10, 13, 14, 23, 25, 25, 27, 33, 39, 45, 59, 65, 73, 82, 94, 94]
数据结构与算法笔记(十)—— 快速排序相关推荐
- 数据结构与算法笔记 —— 十大经典排序及算法的稳定性
一.十大经典排序算法 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全 ...
- 数据结构与算法笔记(十六)—— 二叉搜索树
一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...
- 数据结构与算法笔记(十五)—— 散列(哈希表)
一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...
- 数据结构与算法笔记(青岛大学王卓老师视频)
写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...
- 数据结构与算法笔记 - 绪论
数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...
- JS数据结构与算法 笔记
JS数据结构与算法笔记 前言:不定时更新说明 1. 栈(Stack) 1.1 基于数组实现栈 1.2 基于对象实现栈 1.3 基于链表实现栈 1.4 栈的简单应用 1.4.1 字符串中的括号匹配问题 ...
- 数据结构与算法:十大排序算法之归并排序
数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...
- 数据结构与算法:十大排序算法之插入排序
数据结构与算法:十大排序算法之插入排序 package TopTenSortingAlgorithms;import java.util.Arrays; import java.util.Scanne ...
- 数据结构与算法:十大排序算法之堆排序
数据结构与算法:十大排序算法之堆排序 堆排序可以说是选择排序的优化 package TopTenSortingAlgorithms;import java.util.Arrays; import ja ...
- 数据结构与算法:十大排序算法之冒泡排序
数据结构与算法:十大排序算法之冒泡排序 package array;import java.util.Arrays;//冒泡排序 //1.比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换 ...
最新文章
- java可以多重继承吗_Java中的多重继承与组合vs继承
- 第二章:2.1 微分方程、差分方程求解(概述)
- 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Little Witch Academia(矩阵快速幂)
- centos 杀死进程命令kill
- android系统的发展态势,2020年安卓手机发展的7个趋势,只有延伸,并无革命性的变化...
- process调用protothread机制的相关宏定义——用HelloWorld进程诠释
- inux下切换到root权限有以下几种方式
- 第四届CSTQB®国际软件测试高峰论坛
- SpringCloudAlibaba电商项目实战
- 最新易企秀 微场景制作源码 易企秀去版权源码 带几百套模板
- matlab实用小程序段 —— 串口发送和读取
- sklearn中实现多分类任务(OVR和OVO)
- 【转载】因为专注,所以专业
- red5源码分析---12
- 微博开源框架Motan初体验
- 2020年全国计算机二级考试大纲改变,2020年3月计算机二级考试大纲内容
- 我奋斗了18年才能和你坐在一起喝咖啡
- 认识柯里化函数及其应用
- oracle如何导入一个用户,Oracle 把一个用户的数据导入另一个用户 (数据泵)
- php 正则匹配html中所有图片链接
热门文章
- 关于计算机应用技术的周记,计算机应用技术专业实习周记范文
- html5 游戏前景怎么样,独家 HTML5游戏目前究竟怎么样?看完这篇文章,你或许会清晰很多...
- python programming training(二): 排序算法
- MATLAB从入门到精通-matlab图像处理标记点追踪识别程序
- Tableau可视化分析实战系列浏览 Tableau 环境(四) -功能区和卡参考
- Flink从入门到精通100篇(十三)-Flink的入门教学
- 数学符号的读法和英文表示
- async function_掌握 Async/Await
- 如何用ipad制作精美的视频,并发布到视频网站
- spring boot 在eclipse里启动正常,但打包后启动不起来