合并排序即归并排序,是一种稳定排序,任何情况下的复杂度都为o(nlogn),由于在排序过程中需要一个与文件大小相同的额外空间,故其空间复杂度为o(n)。首先将待排序列划分为n个长度为1的序列,再将其逐渐合并。
#include<iostream>
#include<stdlib.h>
using namespace std;
int temp[7]={0};//额外的辅助空间
void guibin(int num[],int fi,int middle,int la)
{
int n=fi,lenth=la-fi,lm=middle+1;
//将两个有序的子序列依次比较合并,并存入临时辅助空间temp中
while(fi<=middle&&lm<=la)
{
if(num[fi]<=num[lm])
temp[n++]=num[fi++];
else
temp[n++]=num[lm++];
}
while(fi<=middle)
temp[n++]=num[fi++];
while(lm<=la)
temp[n++]=num[lm++];
//将每次整理好的序列再存回num中
for(int i=la;i>=la-lenth;i--)
num[i]=temp[i];
}
//先将待排序列分离成长度为1的序列
void fenli(int num[],int fi,int la)
{
if(fi>=la)//迭代结束的条件
return;
int middle=(la+fi)/2;
fenli(num,fi,middle);//迭代,分离每个子序列的前半部分,直到每个数据相互独立
fenli(num,middle+1,la);//迭代,分离每个子序列的后半部分,直到每个数据相互独立
guibin(num,fi,middle,la);//将两个子序列合并
}
int main()
{
int len=7;
int num[7];
for(int i=0;i<7;i++)
cin>>num[i];
fenli(num,0,len-1);
for(int i=0;i<7;i++)
cout<<num[i];
system("pause");
return 0;
}