- 归并排序是多次将两个或两个以上的有序表合并成一个新的有序表。
归并排序设计思想:
-
通过“归并”两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度。
-
在内部排序中,通常采用的是2-路归并排序,即:将两个位置相邻的记录有序子序列归并为一个记录的有序序列。
-
注:若有三个有序表进行归并的话,称为3-路归并;
由k个有序序列进行归并的话就为k-路归并。
归并排序的具体分析:
-
假设初始序列含有n个记录,则可看成是n个有序的子序列,每个字序列的长度为1,然后两两归并,得到 [ n / 2 ] 个长度为1或2的有序子序列,再两两归并…如此重复,直到得到一个长度为n的有序序列为止。
-
假设待排序列为:
-
第一步:相邻两个元素组合排序
-
第二步:以下均为相邻两个组合进行排序:
-
第三步:
-
第四步:
归并排序的代码实现:
#include<stdio.h>
int a[10]={75,87,68,92,88,61,77,96,80,72};
void Merge(int start,int mid,int end)
{
int b[15]={0};
int j,k=0;
int i=start;
for(j=mid+1;i<=mid&&j<=end;k++)
{
if(a[i]<a[j])
b[k]=a[i++];
else
b[k]=a[j++];
}
while(i<=mid) //将剩余的a[i..mid]复制到b[]
{
b[k++]=a[i++];
}
while(j<=end) //将剩余的a[j..end]复制到b[]
{
b[k++]=a[j++];
}
for (j=0,i=start;j<k;i++,j++) //将b[]中排好的元素重新赋给a[start..end]
{
a[i]=b[j];
}
}
void Msort(int start, int end)
{
if(start>=end)
return;
else
{
int mid=(start+end)/2; //将数组平分为a[start..mid]和a[mid+1..end]
Msort(start,mid); //递归地将a[start..mid]归并为有序的a[stsrt..m]
Msort(mid+1,end); //递归地将a[mid+1..end]归并为有序的a[mid+1..end]
Merge(start,mid,end); //将a[start..mid]和a[mid+1..end]归并到b[start..end]
}
}
int main()
{
Msort(0,9);
int i;
for(i=0;i<10;i++)
{
printf("%d ",a[i]);
}
return 0;
}