假设桌上有两堆牌面朝上的牌,每堆都已排序,最小的牌在顶上。我们希望把这两堆牌合并成单一的排好序的输出堆,牌面朝下地放在桌上。我们的基本步骤包括在牌面朝上的两堆牌的顶上两张牌中选取较小的一张,将该牌从其堆中移开(该堆的顶上将显露一张新牌)并牌面朝下地将该牌放置到输出堆。
归并排序相关文字资料网上较多,在此不再叙述。
cpp代码
#include<iostream>
using namespace std;
void merge(int num[],int beg,int mid,int end);
void mergeSort(int num[],int beg,int end);
int main()
{
int data[] = {3,6,7,2,1,4,5,9,8};
int length = 9;
cout << "before sorted:" << endl;
for(int i = 0;i < length;++i)
cout << data[i] << " ";
cout << endl;
cout << "after sorted:" << endl;
mergeSort(data,0,length-1);
for(int i = 0;i < length;++i)
cout << data[i] << " ";
cout << endl;
return 0;
}
void merge(int num[],int beg,int mid,int end)
{
int temp[10];
int t=beg;
int i=beg,j=mid+1;
while(i<=mid&&j<=end)
{
if(num[i]<num[j])
temp[t++]=num[i++];
else
temp[t++]=num[j++];
}
while(i<=mid)
temp[t++]=num[i++];
while(j<=end)
temp[t++]=num[j++];
for(int i=beg;i<=end;i++)
num[i]=temp[i];
}
void mergeSort(int num[],int beg,int end)
{
if(beg==end)
return;
int mid=(beg+end)/2;
mergeSort(num,beg,mid);
mergeSort(num,mid+1,end);
merge(num,beg,mid,end);
}
运行结果