一个数组,只有1、2、3三种数,如何排序?
桶排序的思维,需要遍历2次,但是如何1次就行呢?
这个题的思维只能顺其自然
因为我们只能依靠一边来 定位一个数,一共只有两边,只能 定位两个数,因为中间留着用来遍历,不能写死。
为了 加深对这一点的认识,假设一个数组只有1、2,我们该怎么做呢?
第一位、最后一位作为两个哨兵,让左边尽量为1,碰到2的时候,停止,从后面开始遍历,保持后面一直为2,找到第一个1,可能要和第一个哨兵停在的地方交换。。。直到两个哨兵相遇。
3个数,不管怎么样,先定位3在最右边总没错!
从右边开始遍历,希望右边都是3,一旦发现一个不是3的数,也就是1或者2,从左边开始遍历。左边我也当然希望全部是1,一旦发现3,立马就可以替换,但是如果是2呢?那就再开一个指针。其实到这里可能有点疑问,这样怎么保持只能遍历一次呢?不管,先再跑跑试试!发现是1,那就和上一个指针交换,如果是3,直接和后一个指针交换。如果是2,那就这样下去,如果是1,那就和上一个指针交换即可。
这个解决方案的思想在于中间第二段的头和尾是可变换的。