1.leftmost是啥?
leftmost代表的是本次传入的数组是否是从最初的int[] nums的最左侧left开始的, 因为本方法在整个排序过程中可能会针对数组的不同部分被多次调用, 因此leftmost有可能为false.
2.如何选取pivot?(附上源码)
首先, 系统会先通过位运算获取数组长度的1/7的近似值(位运算无法精确表示1/7)
然后获取本数组中间位置的索引 e3,在中间位置的左右1/7, 2/7处各获取两个索引(e1, e2, e4, e5):
之后再将这五个索引对应的值用插入算法进行有小到大的排序后, 再放回五个索引的位置 。
接下来进行判断, 若这五个索引对应的元素值各不相同, 则选取e2的值作为Pivot1, e4的值作为Pivot2(特别注意基准是值而不是元素), 然后进行双基准快排 。否则如果有相同的,则选取e3的值作为Pivot进行单基准快排。
3.如何判断数组是否高度结构化?
首先确定一个常量MAX_RUN_COUNT = 67;
然后定义一个计数器int count = 0; 定义一个数组int[] run 使之长度为MAX_RUN_COUNT + 1;
之后我们令run[0] = left, 然后从传入数组的最左侧left开始遍历, 若数组的前n个元素均为升序/降序排列, 而第n + 1个元素的升/降序发生了改变, 则将第n个元素的索引存入run[1], 同时++count, 此时count的值为1;
继续从n + 1开始继续遍历, 直至升/降序再次改变, 再将此处的索引存入run[2], ++count, 此时count的值为2, 以此类推...
若将整个数组全部遍历完成后, count仍然小于MAX_RUN_COUNT (即整个数组升降序改变的次数低于67次), 证明该数组是高度结构化的, 则使用merge sort进行排序。
其实就是记录一下这个数组的升序-->降序或降序-->升序的分界点有几个,如果最后遍历完分界点<67个,则说明数组高度结构化。