c++ - 合并排序算法无法正常工作

标签 c++

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

这是我的代码:

#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++;
    }
}

您可能想要将此处的边界与初始循环进行比较和对比。

关于c++ - 合并排序算法无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7942841/

相关文章:

c++ - 特化和重载有什么区别

c++ - 这个 "on-fly"传递对象会遭受内存泄漏吗?

c++ - 编译时错误 : expected constructor, 析构函数或转换

c++ - 简单的 Qt 应用程序无法在 OS X 上编译

c++ - 'std::pair<std::_Rb_tree_iterator<_Val>, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique 需要

c++ - OpenGL:如何设置渲染器以不显示阴影、灯光和颜色阴影?

c++ - 使用 QIODevice::write 方法添加 "&#xd; "而不是回车

c++ - Velocity verlet 算法 - n 体问题的能量增加

c++ - 调试 AutoCAD 模块

c++ - 关机 Hook C++