采用算法导论上的实现方式,用java实现。

快排算法核心的部分便是partition过程,这里的partition采取最后一个元素作为pivot,i和j两个指针都从头向后扫描,如下图所示,数组被分为4个部分。

算法执行的过程:

代码实现:包括快速排序, 寻找第K大元素, 洗牌算法。

importjava.util.Arrays;importjava.util.Random;public classMySort {/*** 快速排序

*

*@parama*/

public static void quickSort(int[] a) {

qSort(a,0, a.length - 1);

}private static void qSort(int[] a, int p, intr) {if (p < r) {//递归算法不要忘记了出口

int q =partition(a, p, r);

qSort(a, p, q- 1);

qSort(a, q+ 1, r);

}

}private static int partition(int[] a, int p, intr) {int x =a[r];int i = p - 1;int j =p;for (j = p; j < r; j++) {if (a[j] <=x) {

i++;

swap(a, i, j);

}

}

swap(a, i+ 1, r);return i + 1;

}private static void swap(int[] a, int i, intj) {if (i !=j) {int tmp =a[i];

a[i]=a[j];

a[j]=tmp;

}

}/*** 返回第k大的元素。

*

*@parama

*@paramk

*@return

*/

public static int selectKSmallest(int[] a, intk) {if (k >= a.length || k < 0)return -1;

qSelect(a, k,0, a.length - 1);returna[k];

}private static void qSelect(int[] a, int k, int p, intr) {if (p k)

qSelect(a, k, p, q- 1);else if (q

qSelect(a, k, q+ 1, r);else

return;

}

}/*** 洗牌算法

*

*@parama*/

public static void shuffle(int[] a) {for (int i = 0; i < a.length; i++) {int k = new Random().nextInt(i + 1);//return a random value in//[0,i].

int tmp =a[k];

a[k]=a[i];

a[i]=tmp;

}

}public static voidmain(String[] args) {int[] a = { 2, 8, 7, 1, 3, 5, 6, 4};

System.out.println("before sorting:" +Arrays.toString(a));

quickSort(a);

System.out.println("after sortint:" +Arrays.toString(a));

shuffle(a);

System.out.println("after shuffling:" +Arrays.toString(a));

System.out.println(selectKSmallest(a,3));

}

}

正确性证明:

双指针向内的快速排序:   Algorithms里讲的很好,看这里

importjava.util.Arrays;public classtest {public static void quickSort2(int[] a) {

qSort(a,0, a.length - 1);

}/*** 注意1:递归终止条件 l>=r

* 注意2:i和j初始位置,用do while保证至少有一次变化,不会原地不动

* 注意3:j最终的位置是要和l交换的位置。

* 注意4:对于跟pivot相等的情况,应该停住两个指针并交换,虽然交换次数增多,但是保证partition更平均,复杂度更低。*/

private static void qSort(int[] a, int l, intr) {if (l >=r)return;int t =a[l];int i = l, j = r + 1;while (true) {do{

i++;

}while (i <= r && a[i]

j--;

}while (a[j] >t);if (i >j)break;

swap(a, i, j);

}

swap(a, l, j);

qSort(a, l, j- 1);

qSort(a, j+ 1, r);

}private static void swap(int[] a, int i, intj) {int tmp =a[i];

a[i]=a[j];

a[j]=tmp;

}public static voidmain(String[] args) {int[] a = { 1, 1, 1, 1, 1};

System.out.println(Arrays.toString(a));

quickSort2(a);

System.out.println(Arrays.toString(a));

}

}

快速排序细节及优化:

1. pivot随机化:不一定每次都选第一个为pivot, 可以先做 swap(a[0], a[rand(l,r)]);或者选取三个样本中的中位数作为pivot

2. 两个指针移动的时候对于跟pivot相等的元素,应该停住交换,而不是跨过。(虽然增加了交换时间,但是保证了极端情况,比如元素全部相等情况下,partition分区极不均匀的情况。)

3. r-l 小于一定的cutoff之后,选用insertion sort等方法。

4. 3-way-partation。:当数组有大量重复元素时,这种优化复杂度甚至可以降到线性。

快速排序 java cutoff_排序之 快速排序相关推荐

  1. 快速排序 java代码_java实现快速排序

    一:快速排序的特征 1:冒泡排序的改进 2:内部交换数据 3:分治+递归的思想 4:稳定排序 5:时间复杂度为:O(n*logn) 二:算法的整体思路 1:原始数据:12 11 6 87 23 8 5 ...

  2. java随机数排序算法_理解快速排序算法

    快速排序在平均状况下,排序n个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n^2)次比较,但这种状况并不常见.事实上,快速排序通常明显比 其他Ο(n log n)算法更快,因为它的内部循环 ...

  3. 快速排序 java导包_排序算法-快速排序(Java实现)

    上篇我们讲了冒泡排序,这次我们讲它的升级版快速排序,"快速",一看就是个好算法~ 快速排序(QuickSort)是啥? 我们先看下百度百科的介绍快速排序(Quicksort)是对冒 ...

  4. 排序之快速排序的java语言简单实现

    快速排序应该是排序算法里面经典里的经典了,在上两周美图手机的现场笔试中有一道编程题居然是现场默写排序算法(当然我那时全忘了,毕竟我平时最常用的排序算法是java里面的Arrays.sort()). 快 ...

  5. java版排序算法简介及冒泡排序以及优化,选择排序,直接插入排序,希尔排序,堆排序,快速排序及其优化前言 2 分类 2 稳定性 3 时间复杂度 4 Java实现版本 5 1、冒泡排序 6 2、选择排序

    好吧 ~~csdn太难用了....尼玛...写了半天的也无法弄进去...lz正在找更好地博客,or放在github上打算.. 下边是lz自己的有道云分享,大概内容是 http://note.youda ...

  6. 【Java】八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序

    这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序.冒泡排序.选择排序.希尔排序 .快速排序.归并排序.堆排序和LST基数排序,需要的朋友可以参考下 本文实现了八个常用的排序算法:插入排序 ...

  7. 【Java】排序算法 之 【快速排序】 总结

    目录 快速排序: 1.1 hoare法(左右指针法) 1.2 挖坑法(重点) 1.3 快速排序优化 1.4 非递归快速排序 1.5 基准值的选择方法 : 1.6 思路总结 快速排序: 原理: 从待排序 ...

  8. 排序算法之快速排序(Java)

    快速排序    平均时间复杂度  O(NlogN)  最差时间复杂度O(N*N)   不稳定 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据 ...

  9. java的 交换排序 快速排序算法_数据结构之排序算法Java实现(4)—— 交换类排序之快速排序算法...

    快速排序算法属于"交换类"的排序,它的效率主要跟数据分布是否对称有关. 升序排序: /** * 快速排序 * 升序排序 */ @Override public > void ...

最新文章

  1. 字符串算法--KMP--Java实现
  2. 10年后的计算机会是怎样的?
  3. 风洞试验计算机控制模块,计算机控制风洞
  4. Kubernetes 是一个“数据库”吗?
  5. 博士考试考完了,庆祝一下
  6. C#:设置CefSharp的一些参数,比如忽略安全证书
  7. 【NB-IoT模块显示屏逻辑显示】
  8. VB向服务器上传文件,在VB中实现文件上传
  9. 自适应波束形成matlab,自适应波束形成matlab
  10. 【转载】电信光猫中兴F451破解方法
  11. 我读“世界500强面试题”
  12. 软件测试周刊(第47期):要爱具体的人,不要爱抽象的人;要爱生活,不要爱生活的意义。
  13. 场景识别帮助小白用户实现一键式智能拍照修图
  14. EXCEL单元格内多个姓名如何统计个数
  15. 简明解释算法中的大O符号
  16. 软件开发公司管理手册 (下)
  17. 基辛格和张忠谋对骂,源于Intel已到生死关头
  18. android 小米截图,小米6怎么截图?小米6截屏的六种方法
  19. 西雅图Oracle公寓租赁,西雅图Seattle租房攻略
  20. ImageMagick使用for java(im4java)

热门文章

  1. Hibernate入门6.Hibernate检索方式
  2. matlab函数:度分秒转换为度、度分秒转弧度、弧度转度
  3. 商业承兑汇票的相关概念
  4. 计算机类核刊 版面费,核心期刊的版面费怎么算
  5. 北航计算机考研复试时间,北京航空航天大学计算机学院2019年硕士研究生复试安排...
  6. 让java支持es6_简单看看es6解构赋值
  7. 遗传编程(Genetic Programming, GP)
  8. Win7 BitLocker加密须了解的五件事
  9. java-php-python-springboot小区停车场管理系统计算机毕业设计
  10. Dreamweaver下拉菜单全攻略