三数取中
就是将整个数组分为两半,三个数(头、尾、中间)的第二大的数字和 left 位置的数字相交换,可以避免排一个有序的数组从而出现单分支树的情况。
- 如果每次都找了一个最小的值作为基准值,那就会导致这个结点没有左子树,后面的结点也是相同的。
代码
这种是直接列举,也可以直接排序,然后返回第二个就行(因为只有三个数)
private int midOfThree(int[] array, int left, int right) {int mid = (left + right) >> 1;if (array[left] > array[right]) {// mid > left > rightif (array[mid] > array[left]) {return left;}// left > mid > rightelse if (array[mid] > array[right]) {return mid;}// left > right > midelse{return right;}} else {// left < right < midif (array[right] < array[mid]) {return right;}// left < mid < rightelse if (array[mid] < array[right]) {return mid;}// mid < left < rightelse{return left;}}}