排序之快速排序
来源:互联网 发布:数据标准是什么 编辑:程序博客网 时间:2024/06/04 17:46
快速排序思想
快速排序简称“快排”,快速排序采用的思想是分治思想。
快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。之后递归快速排序基准值的两侧,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。
所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
快速排序是最常用的一种排序算法,速度快,效率高。就像名字一样,快速排序是最优秀的一种排序算法。
快速排序代码
private static void performSort(int[] array, int startIndex, int endIndex) { if (startIndex < endIndex) { int low = startIndex; int high = endIndex; //默认将第一个元素当成“基准值” int temp = array[startIndex]; while (low != high) { while (low < high && array[high] > temp) --high; if (low < high) { array[low] = array[high]; ++low; } while (low < high && array[low] < temp) ++low; if (low < high) { array[high] = array[low]; --high; } } array[low] = temp; //递归左右两侧的序列,进行快速排序 performSort(array, startIndex, low - 1); performSort(array, low + 1, endIndex); } }
时间复杂度分析
快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。
最坏情况
每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果就是基准左边或者右边有一侧为空,另外一侧为剩余所有记录。如果在递归过程中,所选取的下一个基准还是上述的情况,那么每次需要全部记录比较一次。时间复杂度为O(n*n)。
上述情况发生的具体情境:
- 该序列是递增序列或者是递减序列(已经有序),这样的情况下快速排序退化为O(n*n);
- 序列的记录完全相同(上述情况的极端实例),时间复杂度为O(n*n);
最好情况
每次划分所取的基准都是当前无序区的”中值”记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:O(nlgn)
总结
尽管快速排序的最坏时间为O(n*n),但就平均性能而言,它是基于关键字比较的内部排序算法中速度最快者,快速排序亦因此而得名。它的平均时间复杂度为O(nlgn)。快速排序是一种不稳定排序算法。
阅读全文
0 0
- 排序之快速排序
- 排序之 快速排序
- 排序之快速排序
- 排序之------快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之-----快速排序
- 排序之快速排序
- 排序之快速排序
- 排序之快速排序
- Androdi:广播BroadCast
- IPython/Jupyter SQL Magic Functions for PySpark
- 李航统计学习方法-K邻近法
- sqlserver高并发情况下 select 和update操作造成死锁的解决方法
- 区块链开发专题(数字货币的数据结构与签名类型)
- 排序之快速排序
- 解决oracle数据库中clob字段从后台返回到前端问题
- localStorage使用总结
- 数数字 UVa1225
- [DP]LOJ NOI Round #1——接竹竿
- 在Linux中连接和使用云存储的三种途径
- 内存映射文件详解及代码示例
- Socket
- centos 7 + caffe + CPU(only)