您的位置:首页 > 其它

归并排序,递归与非递归

2015-09-01 10:02 302 查看
递归:

void merge_array(int a[],int low,int mid,int end){
int* temp =  new int[end-low+1];
int index_pre = low;
int index_post = mid+1;
int i=0;
while(index_pre<=mid&&index_post<=end){
if(a[index_pre]<a[index_post])
temp[i++] = a[index_pre++];
else
temp[i++] = a[index_post++];
}
if(index_pre<=mid)while(index_pre<=mid)
temp[i++] = a[index_pre++];
if(index_post<=end)while(index_post<=end)
temp[i++] = a[index_post++];
for(i=0;i<end-low+1;i++)
a[low+i] = temp[i];
delete[] temp;
}

void merge_sort(int a[],int low, int high){
if(low<high){
int mid = (low+high)/2;
merge_sort(a,low,mid);
merge_sort(a,mid+1,high);
merge_array(a,low,mid,high);
}
}


非递归:

即以1,2,4,8...为间隔对数组进行归并,需要用到额外的空间。空间复杂度是O(n),时间复杂度为O(nlogn)。

void mergeArray2(int a[],int b[], int low,int mid,int high){
int i=low,j=mid+1,k=i;
while(i<=mid&&j<=high){
if(b[i]<b[j]){
a[k++]=b[i++];
}else{
a[k++]=b[j++];
}
}
while(j<=high)
a[k++]=b[j++];
while(i<=mid)
a[k++]=b[i++];
}
void mergepass(int a[],int b[],int s,const int length){
int i=0;
while(i<=length-2*s){
mergeArray2(a,b,i,i+s-1,i+2*s-1);
i = i+2*s;
}
if(i+s<length)mergeArray2(a,b,i,i+s-1,length-1);
else for(int j=i;j<length;j++)a[j]=b[j];
}
void mergeSort(int temp[],const int length){
int i=0;
int s=1;
int* temp1= new int[length];
while(s<length){
mergepass(temp1,temp,s,length);
s*=2;
mergepass(temp,temp1,s,length);
s*=2;
}
delete[] temp1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: