九度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;

}

 


参考资料:归并排序

 

你可能感兴趣的:(归并排序)