对于快速排序过程中一个的问题:为什么在qsort中递归时,需要将递归范围改为[lo, pos-1]而不是[lo, pos]?
以下看一个具体例子:
1 |
|
在归并排序过程中,递归的两个子范围为[lo, mid]和[mid+1, hi]。那是因为[lo, mid]区间必然是[lo, hi]区间的子区间,而不会和区间[lo, hi]重叠。而这里的pos是通过partition函数返回的,表示在数组中小于等于key的元素范围,pos有可能等于hi,这时区间[lo, pos]和区间[lo, hi]重叠,便会造成无法终止的递归调用。
但实际上,在快速排序的过程中,每次我们至少可以确定一个元素的位置,即主元的位置,因此,问题的规模会慢慢变小。