//将奇数放在偶数前
#include<stdio.h>
//顺序表结构类型定义
typedef struct
{
//数据域
int *data;
//长度
int length;
}List;
/*
* 将顺序表中的所有奇数 放置在偶数前面
* 本质就是利用了快速排序的思想:
* 从左端找到一个偶数,从右端找到一个奇数,两个数进行互换
* */
void set(List &L)
{
//个人习惯数组下标从1开始 left左端遍历索引 right右端遍历索引
int left,right,temp;
left=1;
right=L.length;
while(left<right)
{
//从左端找一个偶数
while(left<right&&L.data[left]%2!=0)
{
left++;
}
//从右端找一个奇数
while(left<right&&L.data[right]%2==0)
{
right--;
}
//一定要判断left<right 只有当偶数在奇数前时,才互换
if(left<right)
{
temp=L.data[left];
L.data[left]=L.data[right];
L.data[right]=temp;
}
}
}
我个人觉得有意思的是,这个算法的本质就是借助了快速排序的思想;
快速排序:将轴心元素存入哨兵岗位,从后端选取一个比轴心元素小的元素填入原轴心元素位置,再从前端选取一个比轴心元素大的填入后端;而这个算法就是从前端选取一个偶数,后端选取一个奇数,然后互换
还有其他的花样,如果题目再要求 在将所有奇数安置在偶数之前后,让所有奇数 偶数呈现一定的顺序排列
**总的来说,可以有4种情形
1.奇数从小到大,偶数从小到大
2.奇数从小到大,偶数从大到小
3.奇数从大到小 ,偶数从小到大
4.奇数从大到小,偶数从大到小
那如果题目做了这样的要求,我们又可以采用什么样的方法去处理呢;我的想法就是每个区域进行快速排序;在上段代码中,我们已经将所有的奇数放置在偶数前了,那 left,right的最终状态一定是 right+1=left;也就是说此时,从1到right就是奇数区域,从left到L.length就是偶数区域,在这两个区域内各自进行快速排序就行。
一个快速排序的思想,可以引出这么多花样,着实有趣!
**