有意思的排序算法-快速排序
来源:互联网 发布:vb编程线制作 编辑:程序博客网 时间:2024/06/05 06:51
快速排序对于含有n个元素的数组,最坏情况的运行时间为O(n2),虽然这个最坏情况的运行时间比较差,但是快速排序通常是用于排序的最佳的实用选择,这是因为其平均性能相当好,而且我们可以采用随机化的快速排序算法,来减少出现最坏情况的机会,其期望运行时间为O(nlgn),而且该记号中含的常数因子很小。
像合并排序算法一样,快速排序也是基于分治法进行排序的。其排序过程分为三个步骤:
分解:数组A[p..r]被划分为两个(可能空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每个元素都小于等于A(q),而且小于等于A[q+1..r]中的元素。下标q也在这个划分过程中计算。
解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]排序。
合并:因为两个子数组是就地排序的,将它们合并不需要操作:整个数组A[p..r]已排序。
Java实现为:
1 import java.util.Random; 2 3 public class QuickSort implements SortAlgorithm { 4 5 private Random rand = null; 6 7 public QuickSort() { 8 rand = new Random(); 9 }10 11 @Override12 public void sort(int[] A) {13 randomizedQuickSort(A, 1, A.length, true);14 }15 16 @Override17 public void sort(int[] A, boolean isInc) {18 randomizedQuickSort(A, 1, A.length, isInc);19 }20 21 /**22 * 随机化的快速排序23 * @param A 要排序的int数组24 * @param p 起始位置25 * @param r 终止位置26 * @param isInc 是否升序,true为升序,false为降序27 */28 private void randomizedQuickSort(int[] A, int p, int r, boolean isInc) {29 if (p < r) {30 int q = randomizedPartition(A, p, r, isInc);31 randomizedQuickSort(A, p, q - 1, isInc);32 randomizedQuickSort(A, q + 1, r, isInc);33 }34 }35 36 /**37 * 随机化的对数组的划分38 * @param A 要划分的int数组39 * @param p 起始位置40 * @param r 终止位置41 * @param isInc 是否升序,true为升序,false为降序42 * @return 划分数组的下标43 */44 private int randomizedPartition(int[] A, int p, int r, boolean isInc) {45 int i = rand.nextInt(r - p);46 exchange(A, r, i + p);47 return partition(A, p, r, isInc);48 }49 50 /**51 * 对数组进行划分52 * @param A 要划分的int数组53 * @param p 起始位置54 * @param r 终止位置55 * @param isInc 是否升序,true为升序,false为降序56 * @return 划分数组的下标57 */58 private int partition(int[] A, int p, int r, boolean isInc) {59 int x = A[r - 1];60 int i = p - 1;61 for (int j = p; j <= r - 1; j++) {62 if (isInc ? A[j - 1] <= x : A[j - 1] >= x) {63 i++;64 exchange(A, i, j);65 }66 }67 exchange(A, i + 1, r);68 return i + 1;69 }70 71 private void exchange(int[] A, int i, int j) {72 int temp = A[i - 1];73 A[i - 1] = A[j - 1];74 A[j - 1] = temp;75 }76 }
到此为止,写完了比较排序的几种最常用的排序算法,不对的地方,请大家批评指正。
- 有意思的排序算法-快速排序
- 有意思的快速排序
- 一个有意思的排序算法
- 有意思的排序算法-插入排序
- 有意思的排序算法-合并排序
- 有意思的排序算法-堆排序
- 一个很有意思的排序算法
- 有意思的算法(一)----冒泡排序
- 有意思的排序问题
- 排序算法--快速排序
- 排序算法--快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法------快速排序
- 排序算法---快速排序
- 排序算法-快速排序
- 排序算法---快速排序
- 排序算法--快速排序
- 有意思的排序算法-堆排序
- 隐藏div+ 设置单元格有细线
- 目标跟踪小结
- 浅谈C++中句柄的使用
- 信号的转发 QSignalMapper,mutex 和waitcondition的使用(QtSdk--threads/movedobject)
- 有意思的排序算法-快速排序
- Project——从网络上获取Html代码
- SQlserver 自动编号问题
- 邻接表实现了一个无向图即图的遍历
- tomcat启动指定项目
- 【GMIC 2012专访】Henri holm:“愤怒的小鸟”在中国变现正当时
- PS快捷键
- JS原型继承实例
- 渐渐远去的面容