将所有奇数放置在所有偶数前

//将奇数放在偶数前
#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就是偶数区域,在这两个区域内各自进行快速排序就行。
一个快速排序的思想,可以引出这么多花样,着实有趣!
**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值