归并排序C++


//确定分界点
//递归排序左右
//归并合二为一


//总体思想:分治
//先进行递归分治 在一个小区间进行排序 之后回溯在一个左右区间都排好的大区间排序 最后归为一个大区间排序
//比如:1 3--7 4 --8 9 -- 10 3-- 4 8
//第一次1 3 --4 7 --8 9--3 10 -- 4 8
//第二次:1 3 4 7 8 --3 4 8 9 10
//最后一次:1 3 3 4 4 7 8 8 9 10
#include "iostream"
const int N=1e2;
int temp[N];

//双指针算法 时间复杂度:O(nlogn)  稳定算法
void merge_sort(int arr[],int left,int right){
    if(left==right)return ;//这种情况下分区里面只有一个数
    int mid=left+right>>1;

    //先递归
    merge_sort(arr,left,mid);
    merge_sort(arr,mid+1,right);

    //对每一个左右小区间进行排序操作
    int m_i=left,m_j=mid+1,k=0;
    while(m_i<=mid&&m_j<=right){
        if(arr[m_i]<arr[m_j])temp[k++]=arr[m_i++];
        else temp[k++]=arr[m_j++];
    }
    //每一层归并
    while(m_i<=mid)temp[k++]=arr[m_i++];
    while(m_j<=right)temp[k++]=arr[m_j++];

    // 赋值给原数组最后一次操作是整个大区间
    for(int i=left,j=0;i<=right;i++,j++)arr[i]=temp[j];//i<=right i<right有一个没顾及
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值