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

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

想到三种方法:

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

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

代码:

关于 奇偶数 排列的方法(C语言)_第1张图片

测试结果:

关于 奇偶数 排列的方法(C语言)_第2张图片

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

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

代码:

关于 奇偶数 排列的方法(C语言)_第3张图片

测试检测:

关于 奇偶数 排列的方法(C语言)_第4张图片

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

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

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

代码:

关于 奇偶数 排列的方法(C语言)_第5张图片

测试检测:

关于 奇偶数 排列的方法(C语言)_第6张图片

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

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

代码:关于 奇偶数 排列的方法(C语言)_第7张图片

测试检测:

关于 奇偶数 排列的方法(C语言)_第8张图片

其他的辅助操作函数:

关于 奇偶数 排列的方法(C语言)_第9张图片


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

还需努力!!!!!


你可能感兴趣的:(学习笔记)