这题有两种解法:用quicksort的partition或双指针。
Partition法:可以减少swap的次数,但不能维持数组元素的相邻顺序。 正是因为partition的这个原因,所以quicksort不是稳定排序。
代码下次补充。
双指针法: swap的次数较多,可以维持数组元素的相邻顺序。
void moveZeroes(vector &nums) {int p1=0, p2=0;while(p2
注意:
1)对于双指针法,我的理解是,0越多,交换次数越少。
所以,对于0很少的情况,可以先预处理把非零元素复制到前部,然后把后面的元素清零。代码如下(参考了九章的讨论):
public void moveZeroes(int[] nums) {int i = 0;for (int j = 0; j }
对于0很多的情况,就可以直接用上面的双指针法了,因为只需要一个循环。