一.定义
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,
每个子序列是有序的,然后再把有序子序列合并为整体有序序列。
二.算法描述(递归实现):
递归过程是将待排序集合一分为二,直至排序集合就剩下一个元素为止,然后不断的合并两个排好序的数组。
三.代码实现(递归实现):
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
/* 将两个有序数组归并到成一个有序数组 */
void Merge(int a[], int tmp[], int start, int mid, int end)
{
int ptmp = start, pleft = start, pright = mid + 1;
int num = end - start + 1;
while(pleft <= mid && pright <= end) {
if(a[pleft] > a[pright])
tmp[ptmp++] = a[pright++];
else
tmp[ptmp++] = a[pleft++];
}
while(pleft <= mid)
tmp[ptmp++] = a[pleft++];
while(pright <= end)
tmp[ptmp++] = a[pright++];
for(int i = start; i <= end; i++)
a[i] = tmp[i];
}
/* 递归归并 */
void MSort(int a[], int tmp[], int start, int end)
{
if(end > start) {
int mid = start + (end - start) / 2;
MSort(a, tmp, start, mid);
MSort(a, tmp, mid + 1, end);
Merge(a, tmp, start, mid, end);
}
}
/* 归并排序接口 */
void Merge_Sort(int a[], int n)
{
int tmp[n];
MSort(a, tmp, 0, n - 1);
}
int main()
{
int i;
int a[] = {1, 9, 2, 8, 3, 7, 4 ,6, 5, 0};
for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
printf("%d ", a[i]);
printf("\n");
Merge_Sort(a, sizeof(a) / sizeof(a[0]));
for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
printf("%d ", a[i]);
printf("\n");
system("pause");
return 0;
}