之前的两篇中,为大家介绍了霍尔划分和挖坑法划分,这一篇,我们来看看第三种划分方法——前后指针法。
前后指针法
顾名思义,需要两个指针,一个在前一个在后,分别用cur表示前指针,prev表示后指针(这里的指针的意思是待排序数列的下标),依旧是这个图,初始时,我们规定cur在prev的后一个位置,这里我们还是选择第一个数为基准值,如下图
箭头指向的为基准值,prev指向这个数列开始的第一个,cur指向prev的后一个位置,此时我们便将它初始化完成。那么现在需要怎么操作呢?
我们规定,prev每次都需要指向从左到它本身之间最后一个小于基准值的数,如果cur的值大于基准值,这时只让cur++,如果cur指向的位置小于基准值,这时我们让prev++后,判断是否与cur的位置相等,若不相等,则交换cur和prev的值。直到cur>end后,我们再交换prev和基准值,这样基准值的位置也就确定了。
现在我们一步步图解
此时初始化后我们发现,cur指向的值小于基准值,我们让prev++,发现prev和cur相等,这时再让cur++,开始下次的判断,如下图
这时cur明显大于基准值,所以我们继续让cur++,而prev保持不动,得到下图
这时我们cur的值小于基准值,我们让prev++,此时prev指向32,我们发现prev不等于cur了,这时我们交换prev和cur的值,如下图
交换后,继续让cur向后走,此时发现cur的值为60,大于基准值,于是prev保持不懂,使cur继续向后走,走到2的位置时,发现其小于基准值,我们让prev++,发现prev为32不等于cur,我们继续交换pre