您的位置:首页 > 其它

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

2017-03-16 23:24 495 查看
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100

void 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');
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: