算法基础3:归并排序(Merge Sort)

来源:互联网 发布:arm编程论文 编辑:程序博客网 时间:2024/04/29 12:20
#include <stdio.h>#include <stdlib.h>#define MAXSIZE 100void MergeSort(int a[], int n);void mergesort(int a[], int p, int r, int tmp[]);void merge(int a[], int p, int q, int r, int tmp[]);void showSeq(int a[], int n);int main(){    int n, nums[MAXSIZE], i;    while (1 == scanf("%d", &n))    {        if (0 == n) break;        for (i = 0; i < n; i++)            scanf("%d", &nums[i]);        showSeq(nums, n);        MergeSort(nums, n);        showSeq(nums, n);    }    return 0;}void MergeSort(int a[], int n){    int* tmp = (int*)malloc(sizeof(int) * n);       // 分配一个n个int大小的数组    mergesort(a, 0, n - 1, tmp);                    // 开始归并排序    free(tmp);}void mergesort(int a[], int p, int r, int tmp[]){    if (p < r)    {        int q = (p + r) >> 1;        mergesort(a, p, q, tmp);        // 排序左半段        mergesort(a, q + 1, r, tmp);    // 排序右半段        merge(a, p, q, r, tmp);         // 合并    }}void merge(int a[], int p, int q, int r, int tmp[]){    int i = p, j = q + 1, k = p;    while (i <= q && j <= r)    // 合并两个有序数组    {        if (a[i] <= a[j])            tmp[k++] = a[i++];        else            tmp[k++] = a[j++];    }    while (i <= q)              // copy 剩余部分        tmp[k++] = a[i++];    while (j <= r)        tmp[k++] = a[j++];    for (i = p; i <= r; i++)    // 将排序好的部分复制回原数组        a[i] = tmp[i];}void showSeq(int a[], int n){    int i = 0;    while (i < n)        printf("%d ", a[i++]);    putchar('\n');}
0 0
原创粉丝点击