归并排序算法通俗易懂

//归并排序算法
    vector<int> merge_sort( vector<int>& arr )
    {
        int m = arr.size();
        if( m<2 ) return arr;
        int pivot = m/2;

        /*以下空间是归并排序的重点*/
        /*高效算法是以空间换时间的,而归并算法所需要的空间即:
        存储排好序后的数组ans,存储左侧元素的数组left,存储右侧元素的数组right*/

        vector<int> left; vector<int> right; 
        //std::copy( arr.begin(),arr.begin()+pivot,left.begin() ); //注意指定内存地址,没有初始分配空间时,会溢出,因为是定义为vector<int> left,没有分配空间
        //std::copy( arr.begin()+pivot, arr.end(), right.begin() );
        for( int i=0; i<pivot; ++i ) left.push_back( arr[i] );
        for( int i=pivot; i<m; ++i ) right.push_back( arr[i] );
        
        left = merge_sort( left ); //深度优先遍历
        right = merge_sort( right );
        /*ans存储中间排好序的结果并返回*/
        vector<int> ans;
        std::vector<int>::iterator l = left.begin(); 
        std::vector<int>::iterator r = right.begin();
        
        while( l!=left.end() || r!=right.end() ) //注意条件判断的完整性
        {
            //if( l==left.end() || *l>*r ) { ans.push_back( *r );++r; }//该条件判断不完整,当r为空时,内存溢出,因此要先判断内存是否为空
            if( l==left.end() ) { ans.push_back( *r );++r; }
            else if( r==right.end() ) { ans.push_back( *l );++l; }
            else if( *l>*r ) { ans.push_back( *r );++r; }
            else if( *l<*r ) { ans.push_back(*l);++l; }
            else if( *l==*r ) { ans.push_back(*l); ans.push_back(*r); ++l; ++r; }
        }
        return ans; //返回排序好的数组
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值