八大排序之归并排序

博客聚焦于八大排序中的归并排序,虽未给出具体内容,但可知围绕归并排序展开,归并排序是信息技术领域重要的排序算法,在数据处理等方面有广泛应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>//自顶向下的方法

using namespace std;

void MergeSort(int numbers[], int length);
void MergeSortCore(int numbers[], int tempArr[], int lowIndex, int highIndex);
void Merge(int numbers[], int tempArr[], int lStart, int rStart, int rEnd);

int main()
{
    //int numbers[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    int length = 0;
    cin >> length;
    int* numbers = new int[length];
    for (int i = 0; i < length; ++i)
        cin >> numbers[i];

    MergeSort(numbers, length);

    for (int i = 0; i < length; ++i)
        cout << numbers[i] << " ";
    cout << endl;

    system("pause");
    return 0;
}

void MergeSort(int numbers[], int length)
{
    int* pTempArr = new int[length];

    if (pTempArr != NULL)//可能申请内存失败
    {
        MergeSortCore(numbers, pTempArr, 0, length - 1);

        delete[]pTempArr;
        pTempArr = NULL;
    }
}

void MergeSortCore(int numbers[], int tempArr[], int lowIndex, int highIndex)
{
    if (lowIndex >= highIndex) return;

    int midIndex = (highIndex - lowIndex) / 2 + lowIndex;//这样做是为了防止两个数相加后会溢出
    MergeSortCore(numbers, tempArr, lowIndex, midIndex);
    MergeSortCore(numbers, tempArr, midIndex+1, highIndex);
    Merge(numbers, tempArr, lowIndex, midIndex + 1, highIndex);
}

void Merge(int numbers[], int tempArr[], int lStart, int rStart, int rEnd)
{
    int lEnd = rStart - 1;
    int tempArrIndex = lStart;
    int numElements = rEnd - lStart + 1;

    while (lStart <= lEnd && rStart <= rEnd)
    {
        if (numbers[lStart] <= numbers[rStart])
            tempArr[tempArrIndex++] = numbers[lStart++];
        else tempArr[tempArrIndex++] = numbers[rStart++];
    }

    while (lStart <= lEnd)
        tempArr[tempArrIndex++] = numbers[lStart++];
    while (rStart <= rEnd)
        tempArr[tempArrIndex++] = numbers[rStart++];


    for (int i = 0; i < numElements; ++i,--rEnd)//从rEnd开始往前复制numElements个元素(即长度)还给原始数组
        numbers[rEnd] = tempArr[rEnd];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值