快速排序
来源:互联网 发布:java读取word文件内容 编辑:程序博客网 时间:2024/06/10 03:25
快速排序的思路是:在数组中找到一个元素,保证这个个元素的左边都小于这个元素,右边大于这个元素,这个操作称为切分,那个元素称为“切分元素”。
每次切分数组,保证“切分元素“”右边的元素总是大于“切分元素”,“切分元素”左边的元素总是小于“切分元素”。那么,这个“切分元素”的最终位置便确定了,在其左右的两个子数组的切分过程中,它不再参与。(但是不能保证切分元素在数组的中央位置)
public static void quickSort(int[] a) {sort(a, 0, a.length - 1);}public static void sort(int[] a, int lo, int hi) {if (lo >= hi) return;int mid = partition(a, lo, hi);//切分函数,确定了mid的最终位置sort(a, lo, mid - 1);//递归切分左子数组sort(a, mid + 1, hi);//递归切分右子数组}public static void partition(int[] a, int lo, int hi) {int i = lo, j = hi + 1;int v = a[lo];//将第一个元素定为切分元素while (true) {while (a[i++] < v) if (i == hi) break;//i最终会定位到hi或右子数组的最左位置while (a[j--] > v) if (j == lo) break;//j最终会定位到lo或左子数组的最右位置if (i >= j) break;exch(a, i, j);}exch(a, lo, j);//将切分元素与小于它的左子数组的最右交换位置return j;}
另外,如果使用辅助数组很容易实现切分,但将切分后的数组复制回去的开销也许会得不偿失,大大降低排序的速度。所以请原地切分。
参考《算法》
阅读全文
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- Groovy基本使用(2):基本语法
- 入门赛11
- 苹果开发者账号申请之邓白氏编码2017最新版
- C++之构造函数和析构函数的调用顺序
- AVFormatContext中的三个AVPacketList类型的缓冲的浅显分析
- 快速排序
- 算法题/重建二叉树
- Spring入门笔记(二) Bean的生命周期
- 青岛网络赛补题...
- MySQL中的alter table命令的基本使用方法及提速优化
- Android异常情况下的生命周期分析
- 花屏黑屏log机制
- selenium常见错误
- LeetCode-64-Minimum Path Sum DP水题