1.基本原理
取两个输入数组A和B,一个输出数组C,以及三个计数器Aptr,Bptr,Cptr,他们初始置于对应数组的开始端。A[Aptr]和B[Bptr]中较小者被拷贝到C中的下一个位置,相关的计数器向前推进一步。当两个输入表有一个用完的时候,则将另一个表中剩余部分拷贝到C中。
一个具体的合并例程如下:(摘自《数据结构与算法分析》Mark Allen Weiss 著)
在归并算法中,如果只有一个元素,那么只有一个元素需要排序,直接得到结果。否则递归的将前半部分和后半部分数据各自归并排序,得到排序后的两部分数据,然后使用上面描述的合并算法再将这两部分合并到一起。
2.实现代码
如下为实现归并排序的例程:
(1)头文件MergeSort.h
#ifndef _MERGESORT_H
#define _MERGESORT_H
typedef int ElementType;
void Merge(ElementType A[], ElementType TmpArray[], int left, int center, int right);//合并
void Msort(ElementType A[], ElementType TmpArray[], int left, int right);//递归函数
void MergeSort(ElementType A[], int N);//驱动程序
#endif
(2)源文件MergeSort.c
#include<stdio.h>
#include<malloc.h>
#include"MergeSort.h"
void MergeSort(ElementType A[], int N)//驱动程序
{
ElementType* TmpArray;
TmpArray = malloc(sizeof(ElementType)*N);
if (TmpArray != NULL)
{
Msort(A, TmpArray, 0, N - 1);
free(TmpArray);
}
else
{
printf("out of space!!!\n");
exit(1);
}
}
void Merge(ElementType A[], ElementType TmpArray[], int leftStart, int rightStart, int rightEnd)//合并
{
int lengthofarray = rightEnd - leftStart + 1;
int leftEnd = rightStart - 1;
int tmpPos = leftStart;
while ((leftStart<=leftEnd)&&(rightStart<=rightEnd))
{
if (A[leftStart] < A[rightStart])
TmpArray[tmpPos++] = A[leftStart++];
else
TmpArray[tmpPos++] = A[rightStart++];
}
while (leftStart <= leftEnd)//把左边剩余的全部拷贝到临时数组
{
TmpArray[tmpPos++] = A[leftStart++];
}
while (rightStart <= rightEnd)//把右边剩余的全部拷贝到临时数组
{
TmpArray[tmpPos++] = A[rightStart++];
}
//for (int i = leftStart; i <= rightEnd; i++)
// A[i] = TmpArray[i];
for (int i = 0; i < lengthofarray; i++,rightEnd--)//把临时数组里面的数据拷贝回原数组
A[rightEnd] = TmpArray[rightEnd];
}
void Msort(ElementType A[], ElementType TmpArray[], int left, int right)//递归函数
{
int center;
if (left < right)
{
center = (left + right) / 2;
Msort(A, TmpArray, left, center);
Msort(A, TmpArray, center + 1, right);
Merge(A, TmpArray, left, center+1, right);
}
}
(3)源文件main.c
/*******************************************************************************************************************
Function:归并排序
Date:2020/06/17
********************************************************************************************************************/
#include"MergeSort.h"
int main()
{
ElementType A[10] = { 7,19,33,23,9,78,54,37,41,15 };
MergeSort(A, 10);
printf("the Array after sorting is:\n");
for (int i = 0; i < 10; i++)
printf("%d ",A[i]);
printf("\n");
return 0;
}
(4)运行结果