【排序】快排的优化(三数取中)

三数取中

就是将整个数组分为两半,三个数(头、尾、中间)的第二大的数字和 left 位置的数字相交换,可以避免排一个有序的数组从而出现单分支树的情况。

  • 如果每次都找了一个最小的值作为基准值,那就会导致这个结点没有左子树,后面的结点也是相同的。

代码

这种是直接列举,也可以直接排序,然后返回第二个就行(因为只有三个数)

private int midOfThree(int[] array, int left, int right) {
        int mid = (left + right) >> 1;

        if (array[left] > array[right]) {
            // mid > left > right
            if (array[mid] > array[left]) {
                return left;
            }
            // left > mid > right
            else if (array[mid] > array[right]) {
                return mid;
            }
            // left > right > mid
            else{
                return right;
            }
        } else {
            // left < right < mid
            if (array[right] < array[mid]) {
                return right;
            }
            // left < mid < right
            else if (array[mid] < array[right]) {
                return mid;
            }
            // mid < left < right
            else{
                return left;
            }
        }
    }

你可能感兴趣的:(十大排序,算法,java,数据结构)