当前位置:   article > 正文

java 实现快速排序_快速排序java

快速排序java

1.介绍

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

快速排序最好时间复杂度是O(n * log n),最坏时间复杂度是O(n*2) ,平均复杂度是O(n * log n) 

对数log n :表示以2为底 n的对数

2.切分原理 

切分原理: 把一个数组切分成两个子数组的基本思想:

1.找一个基准值,用两个指针分别指向数组的头部和尾部;

2.先从尾部向头部开始搜索一个比基准值小或等于的元素,搜索到即停止,并记录指针的位置;

3.再从头部向尾部开始搜索一个比基准值大或等于的元素,搜索到即停止,并记录指针的位置;

4.交换当前左边指针位置和右边指针位置的元素;

5.重复2,3,4步骤,直到左边指针的值大于右边指针的值停止。 

代码实现

  1. import java.time.Duration;
  2. import java.time.LocalTime;
  3. public class QuickSort {
  4. public static void main(String[] args) {
  5. test1();
  6. // test2();
  7. }
  8. public static void test1() {
  9. // int arr[]= {-9,78,0,23,-567,70};
  10. int len = 12;
  11. int arr[]=new int [len];
  12. for(int i=0;i<len;i++) {
  13. arr[i]=(int) (Math.random()*100);
  14. }
  15. System.out.println("排序前的数组:");
  16. printArr(arr);
  17. quickSort(arr, 0, arr.length-1);
  18. System.out.println("排序后的数组:");
  19. printArr(arr);
  20. }
  21. //若干万数据,测试排序的时间
  22. public static void test2() {
  23. int len=80000;
  24. int arr[]=new int [len];
  25. for(int i=0;i<len;i++) {
  26. arr[i]=(int) (Math.random()*len);
  27. }
  28. LocalTime before=LocalTime.now();
  29. System.out.println("排序前的时间:"+before);
  30. quickSort(arr,0,len-1);
  31. LocalTime after=LocalTime.now();
  32. Duration duration=Duration.between(before, after);
  33. System.out.println("排序后的时间:"+after);
  34. System.out.println("时间差(毫秒):"+duration.toMillis());
  35. }
  36. private static void quickSort(int[] arr, int lo, int hi) {
  37. if(lo>=hi) return ;
  38. int partition=partition(arr,lo,hi);
  39. quickSort(arr,lo,partition-1);
  40. quickSort(arr,partition+1,hi);
  41. }
  42. private static int partition(int[] arr, int lo, int hi) {
  43. //把最左边的元素当作基准值
  44. int key=arr[lo];
  45. int left=lo; //
  46. int right=hi+1;
  47. while(true) {
  48. //左指针遇到>=key的值,才停下
  49. while(arr[++left] < key) {
  50. if(left==hi) break;
  51. }
  52. //右指针遇到<=key的值,才停下
  53. while(key < arr[--right]) {
  54. if(right==lo) break;
  55. }
  56. if(left>=right) {
  57. //扫描了所有元素,结束循环
  58. break;
  59. }else {
  60. //交换左右指针
  61. swap(arr,left,right);
  62. }
  63. }
  64. //right指向的值一定是小于或等于key值,所以交换key和右指针的值
  65. swap(arr,lo,right);
  66. return right;
  67. }
  68. /**
  69. * 交换数组两个元素
  70. * @param arr
  71. * @param i
  72. * @param j
  73. */
  74. private static void swap(int[] arr, int i, int j) {
  75. int temp=arr[i];
  76. arr[i]=arr[j];
  77. arr[j]=temp;
  78. }
  79. private static void printArr(int[] arr) {
  80. for (int i : arr) {
  81. System.out.print(i+" ");
  82. }
  83. System.out.println();
  84. }
  85. }

运行结果:

test1()

 test2

快速排序的另一种实现

我认为这种写法更容易理解

  1. public static void QuickSort(int []arr,int low,int high) {
  2. if(low<high) {
  3. int pivotpos=partition(arr,low,high);
  4. QuickSort(arr,low,pivotpos-1);
  5. QuickSort(arr,pivotpos+1,high);
  6. }
  7. }
  8. private static int partition(int[] arr, int low, int high) {
  9. int pivot=arr[low];
  10. while(low<high) {
  11. //起初,一定要从右边指针开始,因为arr[low]的值已经扔给了pivot,arr[low]
  12. //想象成无数字的空位
  13. while(low<high&&pivot<=arr[high]) {
  14. --high;
  15. }
  16. //把比pivot的小的数扔到左边指针
  17. //把arr[high]扔到arr[low]这个空位上
  18. //然后,high位置可以想象成无数字的空位
  19. arr[low]=arr[high];
  20. while(low<high&&arr[low]<=pivot) {
  21. ++low;
  22. }
  23. //把比pivot大的数扔到右边
  24. //把arr[low]扔到arr[high]这个空位上
  25. //然后,low位置可以想象成是无数字的空位
  26. arr[high]=arr[low];
  27. }
  28. //此时low==high,return high也一样
  29. arr[low]=pivot;
  30. return low;
  31. }
  32. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/585122
推荐阅读
相关标签
  

闽ICP备14008679号