调整数组顺序使奇数位于偶数前面

调整数组顺序使奇数位于偶数前面
  • 参与人数:3497时间限制:1秒空间限制:32768K
  • 通过比例:17.74%
  • 最佳记录:0 ms|0K(来自  zhb186

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
 1 /* C++
 2     如果题目要求保证奇数和奇数、偶数和偶数之间的相对位置不变,
 3     就可以使用vector的erase和push_back进行操作。
 4     顺序遍历数组arr,遇到偶数,则删除该值,并将该值push到arr数组的末尾。
 5     时间复杂度为O(n)。
 6     注意:需要设置一个index,控制处理的数值个数,当处理次数等于数组大小时结束,
 7         否则当已将所有偶数放在数组后面时,将进入死循环。
 8 */
 9 
10 void reOrderArray(vector<int> &arr){
11     int tmp;
12     int index = 0;
13     for (vector<int>::iterator it = arr.begin(); it != arr.end(); ){
14         index++; 
15         if ( (*it & 1) == 0){    // 偶数
16             tmp = *it;
17             it = arr.erase(it);
18             arr.push_back(tmp);
19         }
20         else
21             it++;
22         if (index == arr.size())
23             return;
24     }
25 }
 1 /* C
 2     如果不要求保证奇数和奇数、偶数和偶数之间的相对位置不变!
 3     1、最简单的思路:
 4         与上面的C++方法一样,但是在C中,从头扫描数组,每碰到一个偶数,
 5         就拿出该数字,把该数字后面的所有数字往前移动1位,然后把该数字放在数组末尾。
 6         时间复杂度为O(n^2)。
 7     2、另一种思路:
 8         设置两个指针p1、p2,分别指向数组的第一个和最后一个数字,p1只向后移动,p2指向前移动。
 9         如果p1指向的为偶数,且p2指向的为奇数,则交换这两个数字。
10         时间复杂度为:O(n)。
11        在实现中,使用了函数指针,这样就给出了一个模型,可以解决一系列同类型的问题。
12        eg:所有负数都放在非负数前面;能被3整除的数放在不能被3整除的数前面,等等。
13 */
14 bool isEven(int n){
15     return (n & 1) == 0;
16 }
17 void reOrderArray(int *a, int len, bool (*func)(int)){
18     if (a == NULL || len == 0)
19         return;
20     int p1 = 0, p2 = len-1;
21     while(p1 < p2){
22         while(p1 < len && !func(a[p1]))    // 向后移动p1,直到p1指向偶数
23             p1++;
24         while(p2 >= 0 && func(a[p2]))    // 向前移动p2,直到p2指向奇数
25             p2--;
26         if (p1 < p2){
27             int tmp = a[p1];
28             a[p1] = a[p2];
29             a[p2] = tmp;
30         }
31     }
32 }
33 int main(){
34     int a[] = {1,2,3,4,5,6,7};
35     reOrderArray(a, 7, isEven);
36     for (int i = 0; i < 7;i++)
37         cout << a[i] << endl;
38     return 0;
39 }

 

posted @ 2015-10-12 10:51  KindaCrazy  阅读(126)  评论(0编辑  收藏  举报