非递归实现合并排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zslngu/article/details/82108210

通过循环 分别对每两个元素 四个元素…内部进行排序,模拟递归的过程

//hebing [l,mid] [mid+1,r] 
void hebing(int *a,int *b,int l,int mid,int r){
    int k=l;
    int rb=mid+1;
    while((l<=mid)&&(rb<=r)){
        if(a[l]<=a[rb]){
            b[k++]=a[l++];
        }else{
            b[k++]=a[rb++];
        }
    }

    if(l<=mid){
        for(int i=l;i<=mid;i++){
            b[k++]=a[i];
        }
    }
    if(rb<=r){
        for(int i=rb;i<=r;i++)
            b[k++]=a[i];
    }
}

//每s个元素为一组 一组拆分为两部分 组内排序 
void Merge(int *a,int *b,int s,int len){
    int i=0;
    while(i+s<len){
        hebing(a,b,i,i+s/2-1,i+s-1);
        i+=s;
    } 
    //剩下的元素 是否可以划分为两组(其中一组元素并不满数 
    if(i+s/2<len){
        hebing(a,b,i,i+s/2-1,len-1);
    }else{ //只剩下一组 
        for(int j=i;j<len;j++){
            b[j]=a[j];
        } 
    }



}
void mergeSort(int *a,int *b,int len){
    int s=1;

    while(s<len){
        s+=s;
        Merge(a,b,s,len);
        s+=s;
        Merge(b,a,s,len);

    }

}

猜你喜欢

转载自blog.csdn.net/zslngu/article/details/82108210