负数移到正数前面
已知顺序表 ( a 1 , … , a n ) (a_{1},\dots,a_{n}) (a1,…,an),每个元素都是整数,把所有值为负数的元素移到全部正数值元素前边
算法思想
快排的前后指针版本
 排序|冒泡排序|快速排序|霍尔版本|挖坑版本|前后指针版本|非递归版本|优化|三数取中©-CSDN博客
 前后两个指针往后走
 cur找负数,++prev,交换prev和cur的值
 prev有两种情况:
- 在cur还没遇到正数的时候,prev紧跟着cur
- 在cur遇到正数的时候,prev在一组正数的前面
 交换:把正数往后推,把负数往前甩
 本质是把一段正数的区间,推箱子似的往右推,同时把负数甩到左边去
int Rearrange(SqList a, int n)
{int prev = 0;  //指针 prev,用于记录负数区间的最后一个负数int cur = 0;   //指针 cur,用于遍历数组中的每个元素while (cur < n)  //继续遍历直到 cur 超出数组范围{if (a[cur] < 0)   //如果当前元素为负数{Swap(&a[prev++], &a[cur]);  //将负数放到负数区间的末尾}++cur;            //移动 cur 到下一个元素}return prev;          //返回负数区间的结束位置
}
![![[Pasted image 20241025141506.png]]](https://i-blog.csdnimg.cn/direct/a704f858fb8046b8acfd139aea8df911.png)
cur指向的是负数,与prev交换,prev++
 ![![[Pasted image 20241025141633.png]]](https://i-blog.csdnimg.cn/direct/6b6529ad6c714935aee5cfeacda405e3.png)
cur++,判断下一个元素
 ![![[Pasted image 20241025141655.png]]](https://i-blog.csdnimg.cn/direct/7f04e8b9ebe94d7b87e11819d4e10bfe.png)
为3,cur继续往下遍历
 ![![[Pasted image 20241025141715.png]]](https://i-blog.csdnimg.cn/direct/9aee07b6a9eb4377b8ded093df6eeb37.png)
cur指向-4,与prev交换,prev++
 ![![[Pasted image 20241025141813.png]]](https://i-blog.csdnimg.cn/direct/7e84d8f1801742149213c5af421e5321.png)
cur++
 ![![[Pasted image 20241025141826.png]]](https://i-blog.csdnimg.cn/direct/a8b56d61b7e04e42b627de99df303a71.png)
指向-1,与prev交换,prev++
 ![![[Pasted image 20241025141906.png]]](https://i-blog.csdnimg.cn/direct/b2d38df8f689430cb77dcbb52b39ed9f.png)
cur++
 ![![[Pasted image 20241025141917.png]]](https://i-blog.csdnimg.cn/direct/8e76f5bbb87f498dbb77946737a6d5b6.png)
为6,结束循环
小于x移到大于x前面
设有一元素为正数的线性表L(a1,a2,…,an),存放在一维数组A[N]中,以an作为参考元素,将该表分为左右两部分,左半部分的每个元素小于等于an,右半部分每个元素都大于an,an位于分界位置上,并把结果仍存放在A[N]中
int Rearrange(int a[], int n)
{int prev = 0;         //指针 prev,用于记录小于an区间的最后一个负数int cur = 0;   //指针 cur,用于遍历数组中的每个元素int keyi = n - 1;while (cur < n)  //继续遍历直到 cur 超出数组范围{if (a[cur] < a[keyi])   //如果当前元素小于an{Swap(&a[prev++], &a[cur]);  //将其放到前半部分区间的末尾}++cur;            //移动 cur 到下一个元素}//只有在 prev 不等于 keyi 时才交换if (prev < keyi){Swap(&a[prev], &a[keyi]);}return prev;          //返回小于an的元素数量
}
奇数移到偶数前面
已知线性表按顺序存储,且每个元素都是整数均不相同,把所有奇数移到所有偶数前边
思想同上
int Rearrange(SqList a, int n)
{int prev = 0;  //指针 prev,用于记录负数区间的最后一个负数int cur = 0;   //指针 cur,用于遍历数组中的每个元素while (cur < n)  //继续遍历直到 cur 超出数组范围{if (a[cur] % 2 != 0)   //如果当前元素为奇数{Swap(&a[prev++], &a[cur]);  //将奇数放到前半区间的末尾}++cur;            //移动 cur 到下一个元素}return prev;          //返回奇数区间的结束位置
}