Arrays.sort()的排序算法

Arrays.sort()有很多重载方法,这里以sort(int[] a)方法为例解析其中的排序算法。

public static void sort(int[] a) {
	DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
}

DualPivotQuicksort翻译过来就是双轴快排,进入里面的sort方法

// Use Quicksort on small arrays
if (right - left < QUICKSORT_THRESHOLD) {
	sort(a, left, right, true);
	return;
}

首先判断数组的长度是否小于QUICKSORT_THRESHOLD,这个值为286,假设小于286,继续进入里面的sort方法

private static void sort(int[] a, int left, int right, boolean leftmost) {
	int length = right - left + 1;

	// Use insertion sort on tiny arrays
	if (length < INSERTION_SORT_THRESHOLD) {
        ...
    }
	...
}

这里继续判断数组长度如果小于INSERTION_SORT_THRESHOLD,这个值为47,意味着如果数组长度小于47就使用插入排序。

小结:如果数组长度小于47,使用插入排序算法,如果大于47并且小于286,使用双轴快排算法。

若数组长度大于286,我们继续往下看

// Check if the array is nearly sorted
        for (int k = left; k < right; run[count] = k) {
            if (a[k] < a[k + 1]) { // ascending
                while (++k <= right && a[k - 1] <= a[k]);
            } else if (a[k] > a[k + 1]) { // descending
                while (++k <= right && a[k - 1] >= a[k]);
                for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {
                    int t = a[lo]; a[lo] = a[hi]; a[hi] = t;
                }
            } else { // equal
                for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {
                    if (--m == 0) {
                        sort(a, left, right, true);
                        return;
                    }
                }
            }

            /*
             * The array is not highly structured,
             * use Quicksort instead of merge sort.
             */
            if (++count == MAX_RUN_COUNT) {
                sort(a, left, right, true);
                return;
            }
        }

// Check if the array is nearly sorted 判断数组的排序紧密性(连续性)

// use Quicksort instead of merge sort 如果排序紧密性(连续性)不好就使用归并排序

结论:

1,如果数组长度小于47,使用插入排序算法

2,如果数组长度大于47并且小于286,使用双轴快排算法。

3,如果数组长度大于286,排序的紧密性(连续性)不好,使用双轴快排

4,如果数组长度大于286,排序的紧密性(连续性)很好,使用归并排序

参考博客:https://my.oschina.net/u/1174461/blog/1916638

发布了31 篇原创文章 · 获赞 0 · 访问量 1431

猜你喜欢

转载自blog.csdn.net/weixin_41645232/article/details/105461295