九度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 ('
');
    }
 
    return 0;
}


参考资料:归并排序

原文地址:https://www.cnblogs.com/liushaobo/p/4373817.html