合并排序

#include <iostream>
using namespace std;
void Merge(int Array[], int begin, int middle, int end){
    int n1 = middle - begin;
    int n2 = end - middle;
    
    //动态申请内存空间大小,使其能存储正好足够的数据 
    int *left = new int[n1];
    int *right = new int[n2];
    /*注意:left,right 在不断迭代过程中已经排好序了,在后面只需要比较,赋值给Array就可以了,最后总体赋值,因为单个元素满足不了begin==end*/
    //数组两边的数赋值到动态数组内           
    for(int i = 0; i < n1; i++)
        left[i] = Array[begin + i];    //从begin开始赋值,因为  
    for(int i = 0; i < n2; i++)
        right[i] = Array[middle + i];  //从middle开始赋值 
    
    //最初的数组赋值进行归并排序
    int i = 0, j = 0, key;
    for(key = begin; key < end; key++){
        if(i < n1 && left[i] <= right[j])
            Array[key] = left[i++];    
        
        else if(j < n2 && left[i] >= right[j])
            Array[key] = right[j++];
        
        else if(i == n1 && j < n2){         //万一left赋值完了,right还有很多呢?此语句即可解决这个问题
            Array[key] = right[j++];
        }
            
        else if(j == n2 && i < n1){        //同上
            Array[key] = left[i++];
        }    
    }
}
//将数组元素分成单个元素进行处理
void MergeSort(int Array[], int begin, int end){
    //这里和两链表的合并很像,也复习了数据结构链表这一节
    if(begin + 1 < end){               //保证只有一个值的时候退出,防止多余计算,
        int middle = (end + begin) / 2;   //这里可以想想int关于奇数和偶数的除法运算,但是仔细想想都不影响结果
        MergeSort(Array, begin, middle);
        MergeSort(Array, middle, end);
        Merge(Array, begin, middle, end);  //如何排序交给Merge函数即可
    }
}
int main(){
    //数据的初始化
    int n;
    cin>>n;
    int Array[n];
    //输入数据
    for(int i = 0; i < n; i++)
        cin>>Array[i];
    MergeSort(Array, 0, n);  //数组排序
    //输出排序后的结果
    for(int i =  0; i < n; i++)
        cout<<Array[i]<<" ";
    cout<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值