有时候我们会碰到这样一种情况,有一个很大的乱序数组raw_array[0 -> n -1](百万量级甚至更大),要求这个数组排序后从第i大到第j(j >= i)大个元素,这些元素之间要有序,其中j - i 远小于数组长度n。
这个问题很明显的做法就是对原数组raw_array进行排序,排序后的数组为sorted_array[0 -> n - 1], 需要的结果就是sorted_array[i -> j]。但是这样做的复杂度比较高,O(n*n)量级的。之所以复杂度比较高,是因为做了一些无用的工作,我们的目标只是要求得排序后的sorted_array[i -> j]这些元素, 至于sorted_array[0 -> i - 1], sorted_array[j + 1 -> n - 1]是不是有序不重要,只要保证对于sorted_array[0 -> i - 1]中的所有元素都小于sorted_array[i -> j]中的任何一个,sorted_array[j + 1 -> n - 1]中的所有元素都大于array[i -> j]中的任何一个即可。最后我们只需要对sorted_array[i -> j]中的元素进行排序即可,这个数组比较小,排序的代价比排序原数组的代价低多了。
现在问题的关键转化为,对于一个无序数组,array[0 -> n - 1], 给定一个i(0 <=i < n - 1), 怎么样快速地将其partition为三部分array[0 -> i - 1], a[i], a[i + 1 -> n -1],其中array[0 -> i - 1]中的所有元素小于array[i], array[i + 1 -> n - 1]中的所有元素大于a[i]。如果有这样的方法,