每来一个位置都有三种情况
1)第一种情况
i当前所在的数[i]<num,当前数和小于区域下一个做交换,<区域右扩,i跳下一个
2)第二种情况
[i]=num,i直接跳下一个
3)第三种情况
[i]>num
当前数i大于num
[i]当前数i和大于区域的前一个做交换
大于区域左扩
i原地不变
如图分析
i 位置上3 ,3<5 命中第一条逻辑
然后中了情况3,6大于5
i和大于区域的前一个做交换
6和0交换
大于区域向左扩
i原地不动
因为这个0是交换过来的 还没有看过它 所以原地不动
0是小于num的 中了逻辑1
所以和小于区域的下一个数做交换
0和5交换
小于区域向右扩一个位置
i跳下一个
6>5 名中第三个逻辑
和大于区域的前一个做交换
6和9换
大于区域往左扩一个位置
i原地不动
9>5
名中第三个逻辑
和大于区域的前一个做交换
9和9自己换
大于区域往左扩一个位置
i原地不动
当大于区域和i撞上的时候 交换停止
此时已经做到了 左边都是小于5的,中间都是等于5的,右边都是大于5的
i根据自己现在来到的数
如果是等于num的 就在等于区域直接扩充
然后跳下一个
相当于小于区域推着等于区域往前走
如果i是大于区域的
和大于区域的下一个交换并左扩
要么i往右走压缩待定区域
让小于区域推着等于区域奔向大于区域
要么i位置直接发货到大于区域
让大于区域往左扩 压缩待定位置
当小于区域推着等于区域和大于区域撞上的时候 就结束了
快排1.0版本
在整个数组中 拿最后一个数做划分值
最后一个数认为是num
让最后一个位置前面的这一段 小于等于num的放到左边
大于num的放在右边
这个数和大于区域的第一个数做交换
就可以做到小于等于区域被扩充了 而且最后一个数一定是num
然后剩下的都是大于区域的
让num的左侧和右侧重复这个行为
比如