【排序算法】快速排序
来源:互联网 发布:手机自动关闭数据连接 编辑:程序博客网 时间:2024/06/11 23:53
1.快速排序的定义
快速排序是冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。
快速排序还采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,
快速排序的基本思想:数组中的每个元素与基准值比较,数组中比基准值小的放在基准值的左边,形成左部;大的放在右边,形成右部;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边,直到排序结束。
2.快速排序的流程
找基准值,设Pivot = a[0]
分区(Partition):比基准值小的放左边,大的放右边,基准值(Pivot)放左部与右部的之间。
进行左部(a[0] - a[pivot-1])的递归,以及右部(a[pivot+1] - a[n-1])的递归,重复上述步骤。
实例:
3.快速排序的代码实现
public class QuitSort { public static void main(String[] args) { int[] data = {5,9,4,3,7}; sort(data,0,data.length-1); System.out.println("排序后 "+ Arrays.toString(data)); } public static void sort (int[] data , int left,int right) { if (left>right) { return; } //获取下次分割的基准标号 int mid = getMid(data,left,right); //对“基准标号“左侧的一组数值进行递归的切割,以至于将这些数值完整的排序 sort(data,left,mid-1); //对“基准标号“右侧的一组数值进行递归的切割,以至于将这些数值完整的排序 sort(data,mid+1,right); } public static int getMid(int[] data,int left,int right){ //以最左边的数为基准 int pivot = data[left]; while (left<right){ //从右端开始,向左遍历,直到找到小于pivot的数 while(left<right && data[right] > pivot){ right--; } //将比pivot小的元素放到最左边 data[left] = data[right]; //从左端开始,向右遍历,直到找到大于pivot的数 while(left<right && data[left] < pivot){ left++; } //将比pivot大的元素放到最右边 data[right] = data[left]; } //将pivot放到left的位置, data[left] = pivot; return left; }}
4.算法分析
(1)归并排序算法的性能
(2)时间复杂度
当数据有序时,以第一个关键字为基准分为两个子序列,前一个子序列为空,此时执行效率最差。
而当数据随机分布时,以第一个关键字为基准分为两个子序列,两个子序列的元素个数接近相等,此时执行效率最好。
所以,数据越随机分布时,快速排序性能越好;数据越接近有序,快速排序性能越差。
(3)空间复杂度
快速排序在每次分割的过程中,需要 1 个空间存储基准值。而快速排序的大概需要 Nlog2N次 的分割处理,所以占用空间也是 Nlog2N 个。
(4)算法稳定性
在快速排序中,相等元素可能会因为分区而交换顺序,所以它是不稳定的算法。
(5)基准关键字的选取
基准关键字的选取是决定快速排序算法的关键,常用的基准关键字的选取方式如下:
三者取中
将序列首、尾和中间位置上的记录进行比较,选择三者中值作为基准关键字。随机数
取left和right之间的一个随机数这里写图片描述,用n[m]作为基准关键字。采用这种方法得到的快速排序一般称为随机的快速排序固定值
取最左边元素的值
5.快速排序算法的优化
三者取中算法改进
优化小数组时的排序方案
优化递归操作
本人才疏学浅,若有错,请指出
谢谢!
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法------快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法---快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- 排序算法 快速排序
- 排序算法--快速排序
- 排序算法--快速排序
- 【排序算法】快速排序
- 排序算法--快速排序
- 排序算法:快速排序
- 深度学习在目标跟踪中的应用
- tensorflow 变量生成 变量管理 tf.Variable & tf.get_variable & tf.variable_scope
- 解决IP匹配查询的方案
- Java List<Object>去掉重复对象
- 如何直接运行py文件
- 【排序算法】快速排序
- centOS windows 双系统时间设置
- c# bitmap和base64编码相互转换
- mahout实现的算法集
- PHP面向对象的构造、析构函数
- HDFS文件系统的基本操作 Hadoop权威指南
- Linux命令学习总结: file命令
- Big Event in HDU
- Java 中文字符判断