关于 奇偶数 排列的方法(C语言)

之前看到一道题:将一个序列里面的元素,按照奇数在前,偶数在后的序列排列起来。

想到三种方法:

方法一:类似冒泡的方法,两个指针,从前遍历整个序列,将偶数一个个的往后搬移,直到某个偶数后面不会再有奇数。

此方法的时间复杂度O(N^2)    空间复杂度O(1)   相同性质的相对位置不稳定

代码:


测试结果:


方法二:添加一个计数器count,遇到偶数时,count++,然后继续遍历,遇到奇数时与前count个元素交换,最后实现奇数在前偶数在后的状态。

        相对于方法一,此方法有一定的优化:时间复杂度为O(N)    空间复杂度为O(1)   相同性质的相对位置仍不稳定

代码:


测试检测:


方法三:创建临时空间,才用类似并归法,在临时空间排序,最后拷贝到原空间

1.奇数从数组0号位开始   偶数从最后一个号位开始      

时间复杂度: O(N^2)                   空间复杂度:O(N)                    仍不稳定

代码:


测试检测:


2.改进一下,奇数从0号位开始,偶数从奇数个数 oddsize 号位开始

时间复杂度:O(N^2)         空间复杂度: O(N)                 相同性质数据相对位置不改变,具有稳定性稳定

代码:

测试检测:


其他的辅助操作函数:



由于知识点的问题,眼界太局限了,没有找到时间复杂度为O(N) 空间复杂度为O(1)并且排序稳定的算法。

还需努力!!!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值