时间复杂度:O(nlogn)
由于归并排序过程中,需要与原始记录序列相同数量的存储空间存放归并结果以及递归的深度为logn的栈的空间,因此空间复杂度为O(n+longn)
归并排序是一种比较占内存,但是效率高且稳定的排序算法
#include<iostream>
using namespace std;
const int MAX=100;
void Merge(int *src,int start,int mid,int end){
int *tar=new int[MAX];
int index=0;
int i=start,j=mid+1;
// 扫描第一段和第二段序列,直到有一个扫描结束
while(i<=mid&&j<=end){
if(src[j]>src[i])
tar[index++]=src[i++];
else
tar[index++]=src[j++];
}
// 若第一段序列还没扫描完,将其全部复制到合并序列
while(i<=mid){
tar[index++]=src[i++];
}
// 若第二段序列还没扫描完,将其全部复制到合并序列
while(j<=end){
tar[index++]=src[j++];
}
// 将合并序列复制到原始序列中
for(int i=0;i<index;i++){
src[start+i]=tar[i];
cout<<tar[i]<<" ";
}
cout<<endl;
delete(tar);
}
//递归方式实现归并排序
void MergeSort(int *src,int start,int end){
int mid;
if(start==end)
return;
else{
mid=(start+end)/2;
MergeSort(src,start,mid);
MergeSort(src,mid+1,end);
Merge(src,start,mid,end);
}
}
//非递归方式实现归并排序
void MergeSort2(int *src,int len){
int size=1,low,mid,high;
while(size<len){
low=0;
while(low+size<len){
mid=low+size-1;
high=mid+size;
if(high>=len)//第二个序列个数不足size
high=len-1;
Merge(src,low,mid,high);
low=high+1;//下一次归并时第一关序列的下界
}
size*=2;//范围扩大一倍
}
}
int main(){
int num[10]={2,3,9,6,1,6,4,9,1,9};
MergeSort(num,0,9);
for(int i=0; i<10; i++)
cout<<num[i]<<" ";
cout<<endl<<endl;
int num2[10]={2,3,9,6,1,6,4,9,1,9};
MergeSort2(num2,10);
for(int i=0; i<10; i++)
cout<<num2[i]<<" ";
cout<<endl;
return 0;
}