0. 前言

本系列文章将介绍一些常用的排序算法。排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个“正规”的企业,哈哈,虽然有点戏谑,但是也从侧面证明了排序算法的重要性。

本文将介绍的是常见排序算法中的快速排序。

3.       快速排序

3.1  基本思想

快速排序是一种比较快的排序算法,其基本思想为设置两个指针i和j分别指向第一个和最后一个待排元素,i向后移动,j向前移动,一般选第一个数为标准数,从后面开始,j向前移动时找到第一个比标准小的数,互换位置,然后再从前面,找到第一个比标准大的数,互换位置,第一趟的结果就是标准左边的所有数都小于标准数,右边的所有数都大于标准数,分成两拨后,再对左右两拨继续递归的使用上述方法,最终使整个序列有序。

3.2  代码实现

  1. /*
  2. *@author Calvin
  3. *@blog http://blog.csdn.net/seu_calvin/article/details/55193059
  4. *@date 2017/01/31
  5. */
  6.  
  7. public class Order {
  8. private int[] array;
  9. public Order(int[] array){
  10. this.array = array;
  11. }
  12.  
  13. public void sort() {
  14. if(array!=null){
  15. quickSort(array,0,array.length-1);
  16. }
  17. }
  18.  
  19. public void quickSort(int[] array, int begin, int end){
  20. if(begin < end){
  21. int key = array[begin];
  22. int i = begin;
  23. int j = end;
  24.  
  25. while(i < j){
  26. while(i < j && array[j]>key){
  27. j--;
  28. }
  29. if(i < j){
  30. array[i] = array[j];
  31. i++;
  32. }
  33. while(i < j && array[i]<key){
  34. i++;
  35. }
  36. if(i < j){
  37. array[j] = array[i];
  38. j--;
  39. }
  40. }
  41. //循环完了把最后一个空位i赋值给key
  42. array[i] = key;
  43. //递归完成两个自序列排序
  44. quickSort(array,begin,i-1);
  45. quickSort(array,i+1,end);
  46.  
  47. }
  48. }
  49.  
  50. public void print() {
  51. for(int i = 0; i < array.length; i++)
  52. System.out.println(array[i]);
  53. }
  54.  
  55. public static void main(String[] args) {
  56. int[] array = new int[]{3,1,5,9,6,5,0};
  57. Order order = new Order(array);
  58. order.sort();
  59. order.print();
  60. }
  61.  
  62. }

输出结果略。

3.3  性能特点

快速排序是冒泡排序的一种改进,后者是相邻元素的比较交换,前者是跳跃式交换,因此总得比较次数和交换次数少了很多,因此效率较高。快速排序的时间复杂度为O(nlogn),空间复杂度为O(logn)。快排真正消耗空间是在递归调用上,因为每次递归都要保持一些数据。而且快速排序算法是不稳定的,因为相同值的元素在排序后的相对应的位置会改变。

3.4  可以优化的点

快速排序法在性能上有着很大优势,当然快排也会有一些优化方法,但是快排本身简单易用,因此大多数情况下使用快排就足够了。下面介绍几个快排的优化方法:

(1)标准数的选择一直是第一个可能会导致算法性能很差,可以考虑选头尾中间三个数取中间大小的数为标准数,这样就能对一些情况进行优化。

(2)快排在数据量较小时性能并不比其他算法好,因此可以考虑在待排序列为10左右时,选择其他排序算法继续进行排序。

(3)利用计算机的多线程并行处理来提高快排的执行效率。这不是对算法本身的优化,而是对算法使用上的优化。

3.5  和堆排序的比较

堆排序(后面会总结到)和快排哪个效率更好呢?两者时间复杂度相同,但是空间复杂度堆排序貌似更胜一筹,答案是快速排序比堆排序的效率高很多,并且随着数据规模的扩大,二者的差距不断扩大,快速排序的优势越来越明显。因此堆排比较少被使用。原因总结如下:

(1)首先要明确第一点,数学上的时间复杂度不代表实际运行时的情况。

(2)堆排比较的几乎都不是相邻元素,对cache极不友好,堆排中比较父节点和字节点的值大小的时候,虽然计算下标会很快完成,在大规模的数据中对数组指针寻址也需要一定的时间。而快速排序只需要将数组指针移动到相邻的区域即可。

(3)堆排序中删除堆顶后的将最后的元素放到堆顶,再让其自我调整。这样有很多比较将是被浪费的,因为被拿到堆顶的那个元素几乎肯定是很小/大的,而靠近堆顶的元素又几乎肯定是很小/大的,最后一个元素能留在堆顶的可能性微乎其微,而且很有可能最终再被移动到底部。

算法相关——Java排序算法之快速排序(三)的更多相关文章

  1. 算法相关——Java排序算法之插入排序(四)

    0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...

  2. 算法相关——Java排序算法之桶排序(一)

    (代码中对应一个数组的下标),将每个元素放入对应桶中,再将所有元素按顺序输出(代码中则按顺序将数组i下标输出arrary[i]次),即为{0,1,3,5,5,6,9}. 1.2  代码实现 /* *@ ...

  3. 算法相关——Java排序算法之希尔排序(五)

    个子块,即{3,5},{1,0},{5,2},{9,4},{6,12},将每个子块进行插入排序(即第i位与第i+5位进行比较交换),初步排序结果为{3,0,2,4,6,5,1,5,9,12}.希尔排序 ...

  4. 算法相关——Java排序算法之冒泡排序(二)

    0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...

  5. Java排序算法之快速排序

    Java排序算法之快速排序 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分 ...

  6. Java排序算法(三)

    Java排序算法(三) 三.Java排序算法总结 从这三组时间复杂度对比中,可以看出,堆排序和归并排序是不管在什么情况下发挥稳定的,快速排序好的时候表现如天才,坏情况下比较差强人意,甚至在等待排序个数 ...

  7. java排序算法(五):快速排序

    java排序算法(五):快速排序 快速排序是一个速度非常快的交换排序算法,它的基本思路很简单,从待排的数据序列中任取一个数据(如第一个数据)作为分界值,所有比它小的元素放到左边.所有比它大的元素放到右 ...

  8. java排序算法(三):堆排序

    java排序算法(三)堆排序 堆积排序(HeapSort)是指利用堆积树这种结构所设计的排序算法,可以利用数组的特点快速定位指定索引的元素.堆排序是不稳定的排序方法.辅助空间为O(1).最坏时间复杂度 ...

  9. java排序算法之冒泡排序和快速排序

    总结一下Java排序算法,以便记忆. 各类排序的时间复杂度: 排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 直接插入排序 O(n2)O(n2) O( ...

随机推荐

  1. 安全测试 web应用安全测试之XXS跨站脚本攻击检测

    web应用安全测试之XXS跨站脚本攻击检测 by:授客 QQ:1033553122 说明 意在对XSS跨站脚本攻击做的简单介绍,让大家对xss攻击有个初步认识,并能够在实际工作当中运用本文所述知识做些 ...

  2. (网页)JQuery 对 Select option 的操作(转)

    转自博客园: <select id="selectID" > <option value="1">1</option> &l ...

  3. Websocket通信过程

    1. 客户端与服务器建立连接 2. 客户端通过session向服务器发送消息 3. 服务器接收客户端的消息,调用服务器端的onMessage()方法包装.生成消息内容(新的消息包括客户端ID) 4. ...

  4. [20171225]RMAN-06808: SECTION SIZE cannot be used when piece limit is in effect.txt

    [20171225]RMAN-06808: SECTION SIZE cannot be used when piece limit is in effect.txt --//朋友拿我的一些例子来测试 ...

  5. 基于 node 搭建博客系统(一)

    系统分为两端,分别实现. 管理员端: 功能 :个人信息,设置,发布随笔,随笔列表,删除随笔,查找,文章 等. 技术点:Boostrap + AdminLTE; 基于nodejs 实现的express ...

  6. little kernel 小结

    其实几篇文章都是摘自freebuf安全的文章: 高通(Qualcomm)LK源码深度分析 高通(Qualcomm)LK源码深度分析(二) 高通(Qualcomm)LK源码深度分析(三) 将其整理为比较 ...

  7. windows 实用技巧

    以下内容版权归原作者所有!!!如果侵权,立即删除. 1.系统激活:https://mp.weixin.qq.com/s/Kl_iEeSSxSprblfSRZ6yEQ 2.百度云下载:https://w ...

  8. SQL中的每一张表都必须设有主键吗

    问题描述: 公司的数据库表有时候会看到没有主键的,SQL中的每一张表都必须设有主键吗? 主键的作用: 1)保证实体的完整性: 2)加快数据库的操作速度: 3)在表中添加新记录时,数据库ACCESS会自 ...

  9. 解决 Mac 突然没有声音

    前言 偶尔早上上班时发现Mac突然没有声音了,不明所以.虽然重启也可以,但是也不免太麻烦了.也许是人品不太好,遇到过多次这种情况,就在快要砸了的自己mac的时候,脑中灵光一闪,难道这是因为核心音频守护 ...

  10. Jquery+asp.net实现Ajax方式文件下载实例代码

    如果文件中,需要下载一个文件,一般用超级链接的方式即可. 但是如果是图片,浏览器会默认打开图片浏览,不是实现下载. 考虑可以使用jquery ajax提交form请求的方式. jquery downl ...