您的位置:首页 > 编程语言 > C语言/C++

c++实现的归并排序算法

2015-12-10 16:22 351 查看
**对数组[0,n)排序**


#include <iostream>
#include <cstring>
using namespace std;

void marge_sort(int *a,int x,int y,int *b) //a是要排序的数组,b是临时数组
{
if(y-x>1) //要排序的数组元素大于等于两个
{
int mid=(x+y)>>1; //二分
int i=x,j=mid,p=x;
marge_sort(a,x,mid,b); //对前半区间递归排序
marge_sort(a,mid,y,b); //对后半区间递归排序
while(i<mid||j<y)
{
if(j>=y||(i<mid&&a[i]<=a[j])) b[p++]=a[i++];
else b[p++]=a[j++];
}
for(i=x;i<y;i++)
a[i]=b[i];
}
}

void print(int *a,int n)
{
cout<<"排序后的数组为:"<<endl;
for(int i=0; i<n; i++)
cout<<a[i]<<ends;
cout<<endl<<endl<<endl;
}

int main()
{
int n,i;
cout<<"输入数组元素个数(以0为结束):   ";
while(cin>>n&&n)
{
int *a=new int
;
int *b=new int
;
memset(b,0,n*sizeof(int));
cout<<"依次输入数组元素:      ";
for(i=0;i<n;i++)
cin>>a[i];
marge_sort(a,0,n,b);
print(a,n);
delete []a;
delete []b;
cout<<"输入数组元素个数(以0为结束):   ";
}
return 0;
}


函数中while语句中的判断条件巧妙运用了短路运算符“||”

不理解的话可以换成如下语句

while(i<mid||j<y)
{
if(i>=mid) b[p++]=a[j++];
else if(j>=y) b[p++]=a[i++];
else if(a[i]<=a[j]) b[p++]=a[i++];
else b[p++]=a[j++];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: