题目:输入一个整数数组,实现一个函数来解决该数组中数字的位置,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

本题思路较为简单,我们只需维护两个指针:第一个指针pHead 初始化为数组的第一个元素,第二个指针pTail 初始化为数组的最后一个元素。根据题目要求:所有奇数位于数组的前半部分,偶数位于数组的后半部分;我们只需:

1、使指针pHead 向后遍历,直到指向的整数为偶数;

2、使指针pTail 向前遍历,直到指向的整数为奇数;

3、交换指针pHead 和指针pTail 所指向的元素。

4、在 pHead 和 pTail 相遇之前,pHead继续向后遍历,pTail继续向前遍历。

实现代码为:

 1 #include "stdio.h"
 2 #include "stdlib.h"
 3 
 4 #define N 10
 5 
 6 void swap(int *left, int *right);
 7 void printArr(int *arr, int len);
 8 void initArr(int *arr, int len);
 9 void reorderOddEven(int *arr, int len);
10 
11 void swap(int *left, int *right)
12 {
13     int tmp = *left;
14     *left = *right;
15     *right = tmp;
16 }
17 
18 void printArr(int *arr, int len)
19 {
20     int i;
21     for(i = 0; i < len; ++i)
22     {
23         printf("%3d", arr[i]);
24     }
25     printf("\n");
26 }
27 
28 void initArr(int *arr, int len)
29 {
30     int i;
31     for(i = 0; i < len; ++i)
32     {
33         arr[i] = rand() %100;
34     }
35 }
36 
37 void reorderOddEven(int *arr, int len)
38 {
39     int *pHead = arr;
40     int *pTail = arr + len -1;
41 
42     while(pHead < pTail)
43     {
44         while(pHead < pTail && (*pHead & 0x1) != 0)
45             pHead++;
46 
47         while(pHead < pTail && (*pTail & 0x1) == 0)
48             pTail--;
49 
50         if(pHead < pTail)
51             swap(pHead, pTail);
52     }
53 }
54 
55 int main(int argc, char const *argv[])
56 {
57     int arr[N] = {0};
58     initArr(arr, N);
59     printf("Before: ");
60     printArr(arr, N);
61 
62     reorderOddEven(arr, N);
63     printf("After: ");
64     printArr(arr, N);
65 
66     return 0;
67 }
View Code

相关文章:

  • 2021-06-28
  • 2021-06-21
  • 2021-08-24
  • 2021-08-31
  • 2021-06-14
  • 2021-10-13
  • 2022-01-25
  • 2021-11-29
猜你喜欢
  • 2022-12-23
  • 2021-12-30
  • 2021-09-02
  • 2022-03-10
  • 2022-12-23
  • 2021-11-06
  • 2021-09-09
相关资源
相似解决方案