Fork me on GitHub

算法(调整奇数偶数顺序)

题目

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分

分析

最简单的思路就是从头开始遍历数据,如果遇到一个偶数,则将该位置的偶数取出,然后把位于该数字后边的所有数据都往前移动一位,然后将取出来的数字放到最后一位。此方法时间复杂度为O(n2)。显示不是最高效的。

高效的方法是用两个指针,分别指向数组的开始和结尾。然后指向开始的指针向前编写直到遇到第一个偶数,然后停止;指向结尾的指针同时移动直到找到第一个奇数,然后停止移动指针。这时候交换两个指针的内容,并且继续之前的过程,直到两个指针相遇。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "ReOrderOddEven.h"
void reOrderOddEven(int *pData,unsigned int length){
int *pBegin = pData;
int *pEnd = pData+length-1;
while (pBegin<pEnd) {
while (pBegin<pEnd&&(*pBegin&0x1)!=0) {//奇数
pBegin++;
}
while (pBegin<pEnd&&(*pEnd&0x1)==0) {//偶数
pEnd--;
}
int temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
}
}

测试

1
2
int number[] = {1,2,3,4,5,6,4,3,4,56,7,8,33,22,121,42};
reOrderOddEven(number, sizeof(number)/sizeof(number[0]));
0%