合并排序

       合并排序即归并排序,是一种稳定排序,任何情况下的复杂度都为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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值