【排序算法】- 快速排序

桃扇骨 2022-12-20 06:04 321阅读 0赞

文章目录

  • 1 快速排序法介绍:
  • 2 快速排序法示意图:
  • 3 快速排序法应用实例:

1 快速排序法介绍:

快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行
,以此达到整个数据变成有序序列

2 快速排序法示意图:

在这里插入图片描述

3 快速排序法应用实例:

要求:对[-9,78,0,23,-567,70]进行从小到大的排序,要求使用快速排序法。【测试8w和800w】说明[验证分析]:
1)如果取消左右递归,结果是-9-5670237870
2)如果取消右递归,结果是-567-90237870
3)如果取消左递归,结果是-9-5670237078
4)代码实现

  1. package com.sukang.sort;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Arrays;
  4. import java.util.Date;
  5. /**
  6. * @description:
  7. * 快速排序
  8. * @author: sukang
  9. * @date: 2020-11-11 9:02
  10. */
  11. public class QuickSort {
  12. public static void main(String[] args) {
  13. //测试快排的执行速度
  14. //创建要给80000个的随机的数组
  15. int[] arr = new int[80000];
  16. for (int i = 0; i < 80000; i++) {
  17. arr[i] = (int)(Math.random()*8000000);//生成一个[0,8000000)数
  18. }
  19. //没排序之前数组遍历
  20. System.out.println("排序前的数组" + Arrays.toString(arr));
  21. Date date1 = new Date();
  22. SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  23. String date1Str = simpleDateFormat.format(date1);
  24. System.out.println("排序前的时间是=" + date1Str);
  25. quickSort(arr,0,arr.length-1);
  26. Date date2 = new Date();
  27. String date2Str = simpleDateFormat.format(date2);
  28. System.out.println("排序后的时间是="+date2Str);
  29. //排序之后数组遍历
  30. System.out.println("排序后的数组" + Arrays.toString(arr));
  31. }
  32. public static void quickSort(int[] arr, int left, int right) {
  33. int l = left; //左下标
  34. int r = right; //右下标
  35. //pivot 中轴值
  36. int pivot = arr[(left + right)/2];
  37. int temp = 0;//临时变量,作为交换时使用
  38. //while循环的目的是让比pivot值小放到左边
  39. //比pivot值大放到右边
  40. while(l < r){
  41. //在pivot的左边一直找,找到大于等于pivot值,才退出
  42. while(arr[l] < pivot){
  43. l += 1;
  44. }
  45. //在pivot的右边一直找,找到小于等于pivot值,才退出
  46. while(arr[r] > pivot){
  47. r -= 1;
  48. }
  49. //如果l >= r说明pivot的左右两的值,已经按照左边全部是
  50. //小于等于pivot值,右边全部是大于等于pivot值
  51. if(l >= r){
  52. break;
  53. }
  54. //交换
  55. temp = arr[l];
  56. arr[l] = arr[r];
  57. arr[r] = temp;
  58. //如果交换后,发现这个arr[l] = pivot值 相等 r--,前移
  59. if(arr[l] == pivot){
  60. r -= 1;
  61. }
  62. //如果交换完后,发现这个arr[r] == pivot值 相等 l++,后移
  63. if(arr[r] == pivot){
  64. l += 1;
  65. }
  66. }
  67. //如果l == r,必须l++, r--, 否则为出现栈溢出
  68. if(l == r){
  69. l += 1;
  70. r -= 1;
  71. }
  72. //向左递归
  73. if(left < r){
  74. quickSort(arr, left, r);
  75. }
  76. //向右递归
  77. if(right > l){
  78. quickSort(arr, l, right);
  79. }
  80. }
  81. }

运行结果
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,321人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法——快速排序

    排序算法——快速排序 > 快速排序通过一趟排序将待排序序列分隔成独立的两部分,其中一部分序列的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个

    相关 排序算法快速排序

    首先快速排序,数据结构学完之后,把一些排序只是懂思想,一直没有实现,今天花时间实现了一下 快速排序的思想就是每次从一段中随机选一个数,把这一段中比它小的元素放在这个元素的前

    相关 排序算法——快速排序

    前言 快速排序采用了分治法,即将原问题划分成为若干个规模更小且与原问题相似的子问题,然后递归地解决这些子问题,最后将他们组合起来。 快速排序的思想是:假设数据元素存放在

    相关 排序算法-快速排序

    快速排序 是最高效、不占用空间的一种排序算法 快排的精髓 是在于 找到 中间基数。 比中间基数小的放在左边 ,比中间基数大的放在右边 然后 左右各自进行快排。 参考

    相关 排序算法---快速排序

    基本思路: 快速排序,数组冲两边出发。 首先取一个关键字。 在第一次排序后。 大于和小于 关键字的各在 关键字两边。 然后在对两边 重复上面步骤,取关键字,排序。 直