当前位置:   article > 正文

Java中的Arrays.sort(int[])_arrays.sort int[]

arrays.sort int[]

Arrays.sort(int[])

Arrays.sort(int[])使用的是quicksort+merge sort。

  • 使用quicksort:当数组长度比较小(right-left<286),或者数组有序的程度不是很高(有序子数组个数>=67个),或者有较多的相等元素(连续33个元素相等)使用quicksort。
  • 使用mergesort:当数组长度较长且有序程度较高时,使用。

总结来说,当数组中连续相等的数>=MAX_RUN_LENGTH(33)个时,执行quickSort;当for循环执行次数>=67时,说明数组中的连续子串数目较多(换句话说,在数组长度固定下,每个连续子串的长度较短),有序程度低,执行queckSort。否则,执行mergeSort,

  1. static void sort(int[] a, int left, int right,
  2. int[] work, int workBase, int workLen) {
  3. // Use Quicksort on small arrays,QUICKSORT_THRESHOLD=286
  4. if (right - left < QUICKSORT_THRESHOLD) {
  5. sort(a, left, right, true);
  6. return;
  7. }
  8. /*
  9. * Index run[i] is the start of i-th run
  10. * (ascending or descending sequence).
  11. */
  12. int[] run = new int[MAX_RUN_COUNT + 1];
  13. int count = 0; run[0] = left;
  14. // Check if the array is nearly sorted
  15. for (int k = left; k < right; run[count] = k) {
  16. if (a[k] < a[k + 1]) { // ascending,跳过升序子序列
  17. while (++k <= right && a[k - 1] <= a[k]);
  18. } else if (a[k] > a[k + 1]) { // descending,跳过降序子序列
  19. while (++k <= right && a[k - 1] >= a[k]);
  20. // 将降序子序列变成升序,交换左右两边的值
  21. for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
  22. int t = a[lo]; a[lo] = a[hi]; a[hi] = t;
  23. }
  24. } else { // equal,当有MAX_RUN_LENGTH=33个值连续相等时,使用quicksort
  25. for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
  26. if (--m == 0) {
  27. sort(a, left, right, true);
  28. return;
  29. }
  30. }
  31. }
  32. /*
  33. * The array is not highly structured,
  34. * use Quicksort instead of merge sort.
  35. */
  36. // 当count==MAX_RUN_COUNT(67)时,说明已经遍历了67个连续的子序列,这说明数组有序程度不高,使用quicksort
  37. if (++count == MAX_RUN_COUNT) {
  38. sort(a, left, right, true);
  39. return;
  40. }
  41. }
  42. // 如果在count < MAX_RUN_COUNT(67)的时候,即for循环执行次数少于67次就遍历完了a[],那就说明a[]的有序程度很高,进行merge sort
  43. ......
  44. }

Arrays.sort(int[])使用的quickSort

这个排序算法NB了,其它的快排算法在测试大量数据集的时候,时间复杂度退化到O(n^2),而这个Dual-privot Quicksort依旧能保持O(n logn)的时间复杂度,代码以后有时间再看吧。

  1. * <p>Implementation note: The sorting algorithm is a Dual-Pivot Quicksort
  2. * by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm
  3. * offers O(n log(n)) performance on many data sets that cause other
  4. * quicksorts to degrade to quadratic performance, and is typically
  5. * faster than traditional (one-pivot) Quicksort implementations.

代码分析...

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

闽ICP备14008679号