一、基本思想
1、“归并”的含义:将两个或两个以上有序表组合成一个新的有序表。
2、归并排序的基本思想:将待排序的n个记录,看作n个有序的子序列,每个子序列的长度为1。然后两两归并,得到n/2个长度为2或为1的子序列;再两两归并,...,如此重复,直到得到长度为n的子序列为止。这种排序的方法称为2-路归并排序。2-路归并排序的核心操作:将一维数组中前后两个有序序列归并为一个有序序列。在归并过程中,需要一个与原来长度相同的表存放归并结果。
一趟归并排序操作:需调用n/(2h)次算法merge,将SR[1..n]前后相邻且长度为h的有序段两两归并,得到前后相邻、长度为2h的有序段,并放在TR[1..n]中。整个归并排序需要[log2n]趟。如图所示:
3、归并算法的复杂度:
每趟归并的时间复杂度为O(n),整个算法需log2n趟。时间复杂度为O(nlog2n)。归并排序算法虽简单,但占用辅助空间大,实用性差。归并排序是稳定的排序。
二、算法的C语言描述
三、算法的C语言实现
#include"stdio.h"
#include"stdlib.h"
#define OK 1
#define MAXSIZE 20
typedef intKeyType;
typedef intStatus;
typedef struct
{
KeyType key;
//InfoTypeotherinfo;
}RedType;
typedef struct
{
RedTyper[MAXSIZE+1];
int length;
}Sqlist;
void Merge(RedTypeSR[],RedType TR[],int i,int m,int n)
{
int j,k,l;
for(j=m+1,k=i;i<=m&&j<=n;++k)
{
if(SR[i].key<=SR[j].key) TR[k]=SR[i++];
else TR[k]=SR[j++];
}//for
if(i<=m)for(;i<=m;i++) TR[k++]=SR[i];
if(j<=n)for(;j<=n;j++) TR[k++]=SR[j];
}//Merge
void MSort(RedTypeSR[],RedType TR1[],int s,int t)
{
RedTypeTR2[MAXSIZE+1];
if(s==t)TR1[s]=SR[s];
else
{
int m=(s+t)/2;
MSort(SR,TR2,s,m);
MSort(SR,TR2,m+1,t);
Merge(TR2,TR1,s,m,t);
}//else
}//MSort
voidMergeSort(Sqlist &L)
{
MSort(L.r,L.r,1,L.length);
}
void InputL(Sqlist&L)
{
printf("inputthe length:\n");
scanf("%d",&L.length);
printf("inputthe data needed to sort:\n");
for(inti=1;i<=L.length;i++)
scanf("%d",&L.r[i].key);
}//InputL
voidOutputL(Sqlist &L)
{
printf("thedata after sorting is:\n");
for(inti=1;i<=L.length;i++)
printf("%d ",L.r[i].key);
}
int main()
{
Sqlist L;
InputL(L);
MergeSort(L);
OutputL(L);
return OK;
}