归并排序

不羁的心 提交于 2020-02-01 01:15:46

算法核心:

\color{red}{大序列递归到小序列,进行排序然后合并}

\color{red}{该算法的核心步骤在于——合并!}

\color{green}{合并操作:}
在这里插入图片描述
mark1 mark2分别用来标记两个子段

\color{red}{抓住子段已经排序的特点}

每次把mark1 和mark2 中更小的放进去,放完即合并完毕~

void G(int *head,int *temp,int start,int end){
    //head 为待排序序列 temp为暂存数组 
    //start和end 表示从start到end之间进行排序 
    int mark1,mark2;  //两子段合并时用的的标记变量
    if(start+1==end){  //递归出口
        if(head[start]>head[end]){
            int temp=head[start];
            head[start]=head[end];
            head[end]=temp;
        }
        return;
    }
    if((end-start)%2!=0){ //把序列分成两子段——分治思想
        mark1=0;mark2=(end+start)/2+1;
        G(head,temp,start,(start+end)/2);
        G(head,temp,(start+end)/2+1,end);
    }
    else {  //当待排序数字的数目为奇数时,留下末尾的一个元素
        mark1=0;mark2=end;
        G(head,temp,start,end-1);
    }
    for(int i=start,j=0;j<=end-start;j++,i++){
        temp[j]=head[i];  
    }
    int mid=(end+start)/2+1;  //防止mark1越界到第二个字段
    for(int i=start;i<=end;i++){
        if(mark2<=end&&mark1<mid&&temp[mark1]<=temp[mark2]){ 
            head[i]=temp[mark1];
            mark1++;
        }
        else if(mark2<=end){
            head[i]=head[mark2];
            mark2++;
        }
        else {
            head[i]=temp[mark1];
            mark1++;
        }

      }
    return;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!