#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');
}
算法基础3:归并排序(Merge Sort)
最新推荐文章于 2024-01-15 21:01:20 发布