九度OJ 1516 调整数组顺序使奇数位于偶数前面 -- 归并排序
题目地址:http://ac.jobdu.com/problem.php?pid=1516
- 题目描述:
-
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
- 输入:
-
每个输入文件包含一组测试案例。
对于每个测试案例,第一行输入一个n,代表该数组中数字的个数。
接下来的一行输入n个整数。代表数组中的n个数。
- 输出:
-
对应每个测试案例,
输入一行n个数字,代表调整后的数组。注意,数字和数字之间用一个空格隔开,最后一个数字后面没有空格。
- 样例输入:
-
5 1 2 3 4 5
- 样例输出:
-
1 3 5 2 4
#include <stdio.h> #include <stdlib.h> #define MAX 100000 void Merge(int arr1[], int len1, int arr2[], int len2){ int list[MAX]; int i = 0; int j = 0; int k = 0; while (i < len1 && arr1[i] % 2){ list[k++] = arr1[i++]; } while (j < len2 && arr2[j] % 2){ list[k++] = arr2[j++]; } while (i < len1){ list[k++] = arr1[i++]; } while (j < len2){ list[k++] = arr2[j++]; } for (i=0; i<len1+len2; ++i){ arr1[i] = list[i]; } } void MergeSort(int arr[], int len){ if (len > 1){ int len1 = len / 2; int len2 = len - len1; MergeSort (arr, len1); MergeSort (arr+len1, len2); Merge (arr, len1, arr+len1, len2); } } int main(void){ int n; int arr[MAX]; int i, j; int cnt; int tmp; while (scanf ("%d", &n) != EOF){ for (i=0; i<n; ++i){ scanf ("%d", &arr[i]); } MergeSort (arr, n); for (i=0; i<n; ++i){ printf ("%d", arr[i]); if (i != n-1) putchar (' '); } putchar ('\n'); } return 0; }
参考资料:归并排序