1、简单介绍

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

2、示意图

图片.png

3、源码

  1. package com.study.sort;
  2. import java.util.Arrays;
  3. import java.util.Random;
  4. public class QuickSort {
  5. public static void main(String[] args) {
  6. int[] arr ={20,30,10,0,-10,-50,-30};
  7. quickSort(arr,0,(arr.length)-1);
  8. System.out.println(Arrays.toString(arr));
  9. }
  10. public static void quickSort(int[] arr,int left,int right){
  11. int l = left;//左下标
  12. int r = right;//右下标
  13. int center = arr[(r+l)/2];//中间值
  14. int temp = 0;//定义一个临时变量
  15. //while循环比较center左右两边的值与center的大小,进行交换,值小的放左边
  16. while (l < r){
  17. //左边不断循环,找到arr[l] > center的数
  18. while (arr[l] < center){
  19. l++;
  20. }
  21. //右边不断循环,找到arr[l] < center的数
  22. while (arr[r] > center){
  23. r--;
  24. }
  25. //如果左下标大于或等于右下标,结束循环
  26. if (l >= r){
  27. break;
  28. }
  29. //左右两边交换
  30. temp = arr[l];
  31. arr[l] = arr[r];
  32. arr[r] = temp;
  33. //如果arr[l] == center ,r--,防止进入死循环
  34. if (arr[l] == center){
  35. r--;
  36. }
  37. if (arr[r] ==center){
  38. l++;
  39. }
  40. }
  41. //如果l==r,说明一轮排序结束,将左下标l往后移,右下标r往前移
  42. if (l == r){
  43. l+=1;
  44. r-=1;
  45. }
  46. //左递归
  47. if (left < r){
  48. quickSort(arr,left,r);
  49. }
  50. //右递归
  51. if (right > l){
  52. quickSort(arr,l,right);
  53. }
  54. }
  55. }

**

4、运行结果

图片.png
**

5、时间测试

  1. package com.study.sort;
  2. import java.util.Arrays;
  3. import java.util.Random;
  4. public class QuickSort {
  5. public static void main(String[] args) {
  6. /*int[] arr ={20,30,10,0,-10,-50,-30};
  7. quickSort(arr,0,(arr.length)-1);
  8. System.out.println(Arrays.toString(arr));*/
  9. int[] arr = new int[80000];
  10. Random random = new Random();
  11. for (int i = 0; i < 80000; i++) {
  12. arr[i] = random.nextInt(800000000);
  13. }
  14. long l1 = System.currentTimeMillis();
  15. quickSort(arr,0,(arr.length)-1);
  16. long l2 = System.currentTimeMillis();
  17. System.out.println("快速排序对"+arr.length+"个数据排序所花费的时间为:"+(l2-l1)+"ms");
  18. }
  19. public static void quickSort(int[] arr,int left,int right){
  20. int l = left;//左下标
  21. int r = right;//右下标
  22. int center = arr[(r+l)/2];//中间值
  23. int temp = 0;//定义一个临时变量
  24. //while循环比较center左右两边的值与center的大小,进行交换,值小的放左边
  25. while (l < r){
  26. //左边不断循环,找到arr[l] > center的数
  27. while (arr[l] < center){
  28. l++;
  29. }
  30. //右边不断循环,找到arr[l] < center的数
  31. while (arr[r] > center){
  32. r--;
  33. }
  34. //如果左下标大于或等于右下标,结束循环
  35. if (l >= r){
  36. break;
  37. }
  38. //左右两边交换
  39. temp = arr[l];
  40. arr[l] = arr[r];
  41. arr[r] = temp;
  42. //如果arr[l] == center ,r--,防止进入死循环
  43. if (arr[l] == center){
  44. r--;
  45. }
  46. if (arr[r] ==center){
  47. l++;
  48. }
  49. }
  50. //如果l==r,说明一轮排序结束,将左下标l往后移,右下标r往前移
  51. if (l == r){
  52. l+=1;
  53. r-=1;
  54. }
  55. //左递归
  56. if (left < r){
  57. quickSort(arr,left,r);
  58. }
  59. //右递归
  60. if (right > l){
  61. quickSort(arr,l,right);
  62. }
  63. }
  64. }


6、测试结果
图片.png
图片.png
图片.png
图片.png
图片.png

因为分割的数center是随机选择的,可以选择数据中任何位置的数,选择的数的大小并不能确定为中值,所以当选择的数偏大或偏小,效率便会下降。
对80000个随机数排序,总体速度还是挺快的,但有一点不稳定。