归并排序算法不能正常工作

Merge sort algorithm not working correctly

本文关键字:工作 常工作 算法 不能 归并排序      更新时间:2023-10-16

作为家庭作业的一部分,我需要能够使用结构作为主要参数来实现合并排序。直到今天我才熟悉合并排序,所以我尝试编写自己的实现。由于某种原因,我不能使它工作。

下面是我的代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
struct MergeArgument
{
    int *numArray;
    int *tempArray;
    int lowIndex, highIndex;
};
void merge(MergeArgument*);
void merge_sort(MergeArgument*);
int main(int argc, char** argv)
{   int SIZE = 25;
    MergeArgument arg;
    int arr[SIZE];
    int temp[SIZE];
    for(int k = 0; k < SIZE; k++)
    {
        arr[k] = rand() % 100;
        cout << arr[k] << " ";
    }
    arg.numArray = arr;
    arg.tempArray = temp;
    arg.lowIndex = 0;
    arg.highIndex = SIZE - 1;
    cout << endl;
    merge_sort(&arg);
    cout << "Sorted array: n";
    for (int i = 0; i < SIZE; i++)
        cout << arr[i] << " ";
    cout << endl;
    return 0;
}
void merge_sort(MergeArgument *arg)
{   int tempHigh, tempLow;
    if(arg->lowIndex < arg->highIndex)
    {
        tempHigh = arg->highIndex;
        tempLow = arg->lowIndex;
        arg->highIndex = (tempHigh + tempLow) / 2;
        merge_sort(arg);
        arg->highIndex = tempHigh;
        arg->lowIndex = ((tempHigh + tempLow) / 2) + 1;
        merge_sort(arg);
        arg->lowIndex = tempLow;
        merge(arg);
    }
}
void merge(MergeArgument *arg)
{   int low = arg->lowIndex, mid = ((arg->lowIndex + arg->highIndex) / 2), high = arg->highIndex;
    int i = low, lowCounter = low, highCounter = mid + 1;
    while((lowCounter <= mid) && (highCounter <= high))
    {
        if(arg->numArray[lowCounter] < arg->numArray[highCounter])
        {
            arg->tempArray[i] = arg->numArray[lowCounter];
            lowCounter++;
        }
        else
        {
            arg->tempArray[i] = arg->numArray[highCounter];
            highCounter++;
        }
        i++;
    }
    if (lowCounter < mid)
    {
        for (int k = lowCounter; k < mid; k++)
        {
            arg->tempArray[i] = arg->numArray[k];
            i++;
        }
    }
    else
    {
        for (int k = highCounter; k <= arg->highIndex; k++)
        {
            arg->tempArray[i] = arg->numArray[k];
            i++;
        }
    }
    for(int k = arg->lowIndex; k <= arg->highIndex; k++)
    {
        arg->numArray[k] = arg->tempArray[k];
    }
}

下面是我得到的输出:

83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 26 40 26 72 36 11 68 67 29 82    
Sorted array:  
11 -1216235240 15 0 21 26 -1079135248 26 27 -1079135396 29 -1216770650 35 -1216235240 49 -1216492084 59 0 68 72 82 83 0 86 82

谁能指出我到底做错了什么?

这非常接近于工作,尽管您可能需要考虑一些关于使其更像c++的评论。毫无疑问,这是来之不易的经验,没有足够的时间回去做你真正应该做的事。

问题在这里,在merge:

if (lowCounter < mid)
{
    for (int k = lowCounter; k < mid; k++)
    {
        arg->tempArray[i] = arg->numArray[k];
        i++;
    }
}

您可能希望将这里的边界与初始循环进行比较和对比