为什么我的合并排序不起作用?

时间:2009-11-02 19:18:56

标签: c++ sorting

它编译得很好,但是当它运行时,它会在列表中添加随机高位数,以及现有数字的重复数。我有几个人看过这个,但没有人能弄明白。

void mergeSort(int list[], int length) {
    recMergeSort(list, 0, length - 1);
}

void recMergeSort(int list[], int first, int last) {

    if (first < last) {
        int mid = (first + last) / 2;
        recMergeSort(list, first, mid);
        recMergeSort(list, mid + 1, last);
        merge(list, first, last, mid);
    }
}

void merge(int list[], int first, int last, int mid) {

    int arraySize = last - first + 1;
    int* tempList = new int[arraySize];
    int beginPart1 = first;
    int endPart1 = mid;
    int beginPart2 = mid + 1;
    int endPart2 = last;


    int index = beginPart1;


    while (beginPart1 <= endPart1 && beginPart2 <= endPart2) {
        if (list[beginPart1] < list[beginPart2]) {
            tempList[index] = list[beginPart1];
            beginPart1++;
        }
        else {
            tempList[index] = list[beginPart2];
            beginPart2++;
        }
        index++;
    }

    while (beginPart1 <= endPart1) {
        tempList[index] = list[beginPart1];
        index++;
        beginPart1++;
    }

    while (beginPart2 <= endPart2) {
        tempList[index] = list[beginPart2];
        index++;
        beginPart2++;
    }


    for (int i = first; i <= last; i++) {
        list[i] = tempList[i - first];
    }

    delete[] tempList;
}

3 个答案:

答案 0 :(得分:2)

在函数merge()中,您错误地计算了index变量:

假设begin = 10,mid = 14,end = 19(对于总数组大小为0 .. 19,并且你是recMergeSort()更高的一半),你的索引= 10,但是{ {1}}数组已编入索引tempList(因为0..9 = arraySize == 10)。

因此,您的last - first + 1数组溢出,当您“合并”时,您会收到数据损坏。

将您的tempList变量修改为0(而不是基于index)。

答案 1 :(得分:1)

我认为问题在于:

int index = beginPart1;

应该是

int index = 0;

答案 2 :(得分:0)

如果我在C#中运行它,我会在以下行中获得IndexOutOfRangeException:

                    tempList[index] = list[beginPart1];

我估计如果你追踪它,你可能会在一个缓冲区的末尾运行因此随机数。