C++实现归并排序

C++实现归并排序

//
//  main.cpp
//  MergeSort
//
//  Created by 胡昱 on 2021/10/18.
//

#include <iostream>
using namespace std;

int* mergeSort(int* a, int n) {
    
    if (n == 1) {
        return a;
    }
    
    //  划分子问题
    int leftMid = (0 + n - 1) / 2;
    int rightMid = (0 + n - 1) / 2 + 1;
    
    int leftA_length = leftMid - 0 + 1;
    int rightA_length = n - rightMid;
    
    int* leftA = new int[leftA_length];
    int* rightA = new int[rightA_length];
    
    for (int i = 0; i < leftA_length; ++i) {
        leftA[i] = a[i];
    }
    for (int i = leftA_length; i < n; ++i) {
        rightA[i - leftA_length] = a[i];
    }
    
    // 解决子问题
    leftA = mergeSort(leftA, leftA_length);
    rightA = mergeSort(rightA, rightA_length);
    
    // 合并子问题
    for(int i = 0, leftA_index = 0, rightA_index = 0; i < n; ++i) {
        
        if (leftA_index >= leftA_length) {
            a[i] = rightA[rightA_index];
            ++rightA_index;
            continue;
        }
        
        if (rightA_index >= rightA_length) {
            a[i] = leftA[leftA_index];
            ++leftA_index;
            continue;
        }
        
        if (leftA[leftA_index] >= rightA[rightA_index]) {
            a[i] = rightA[rightA_index];
            ++rightA_index;
        }
        else {
            a[i] = leftA[leftA_index];
            ++leftA_index;
        }
    }
    
    // 释放空间并返回
    delete [] leftA;
    delete [] rightA;
    return a;
}

int main(int argc, const char * argv[]) {
    
    // 共m个问题
    int m;
    cin >> m;
    
    while((--m) >= 0) {
        
        // 输入数组长度
        int n;
        cin >> n;
        
        // 输入数组
        int* a = new int[n];
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
        }
        
        // 开始归并排序
        a = mergeSort(a, n);
        
        // 输出排序后的数组
        for (int i = 0; i < n; ++i) {
            cout << a[i] << " ";
        }
        cout << endl;
        
        // 释放空间
        delete [] a;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值