
用C++实现合并排序
合并排序的思想:当只有一个元素时终止排序,超过一个元素的话,将所有元素分成大致相同的两个集合,分别对两个集合进行排序,最后将排好序的子集合合并为所要求的排好序的集合。
在最坏情况下,时间复杂度为O(nlogn),它是一个渐进的算法。
#include
#include
//这个函数将b[0]至b[right-left+1]拷贝到a[left]至a[right]
template
void Copy(T a[],T b[],int left,int right)
{
int size=right-left+1;
for(int i=0;i
{
a[left++]=b[i];
}
}
//这个函数合并有序数组a[left:i],a[i+1:right]到b,得到新的有序数组b
template
void Merge(T a[],T b[],int left,int i,int right)
{
int a1cout=left,//指向第一个数组开头
a1end=i,//指向第一个数组结尾
a2cout=i+1,//指向第二个数组开头
a2end=right,//指向第二个数组结尾
bcout=0;//指向b中的元素
for(int j=0;j
{
if(a1cout>a1end){b[bcout++]=a[a2cout++];continue;}//如果第一个数组结束,拷贝第二个数组的元素到b
if(a2cout>a2end){b[bcout++]=a[a1cout++];continue;}//如果第二个数组结束,拷贝第一个数组的元素到b
if(a[a1cout]
else
{b[bcout++]=a[a2cout++];continue;}
}
}
//对数组a[left:right]进行合并排序
template
void MergeSort(T a[],int left,int right)
{
T *b=new int[right-left+1];
if(left
int i=(left+right)/2;//取中点
MergeSort(a,left,i);//左半边进行合并排序
MergeSort(a,i+1,right);//右半边进行合并排序
Merge(a,b,left,i,right);//左右合并到b中
Copy(a,b,left,right);//从b拷贝回来
}
}
//from
int main()
{
int n;
cout<<"how many numbers to sort:";
cin>>n;
int *a=new int[n];
cout<<"input "<
for(int i=0;i
{cin>>a[i];}
MergeSort( a, 0, n-1);
for(int j=0;j
{
cout<
}
return 1;
}
2017年计算机二级C++辅导编程:用C++实现合并排序.doc正在阅读:
2017年计算机二级C++辅导编程:用C++实现合并排序08-20
拥抱春天作文1000字10-03
八年级命题作文:定格在记忆中的画面07-18
2018湖南省郴州中共汝城县纪律检查委员会选调18人8月15日报名止07-05
二年级国庆节日记:煎鸡蛋04-03
益智的幼儿睡前故事三篇03-09
行政人员是做什么的|行政人事自我鉴定12-02
高一抒情散文:盛梅·冬_50字04-21