归并排序

算法核心:

大 序 列 递 归 到 小 序 列 , 进 行 排 序 然 后 合 并 \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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值