【问题标题】:Mergesort is giving semi-random unsorted numbers in outputMergesort 在输出中给出半随机未排序的数字
【发布时间】:2022-01-25 02:18:30
【问题描述】:

我正在为类实现排序算法,而归并排序是唯一让我难过的算法。我遇到了 seg 错误和其他问题,但是一旦我“解决”了这些问题,我现在就会坚持使用给出重复值、内存地址且未排序的数组。 代码如下:

void merge(int* array, int first, int mid, int last){
    int first1 = first;
    int tempArr[last + 1];
    int first2 = mid + 1; 
    int last1 = mid; 
    int last2 = last;
    int index = first1; 

    for(; (first1 <= last1) && (first2 <= last2); ++index){
        if(array[first1] < array[first2]){
            tempArr[index] = array[first1];
            ++first1;
        }else {
            tempArr[index] = array[first2];
            ++first2;
        }
    }

    for(; first1 <= last1; ++first1, ++index){
        tempArr[index] = array[first1];
    }
    
    for(; first2 <= last2; ++first2, ++index){
        tempArr[index] = array[first2];
    }

//assigns sorted values to original array
    for(index = 0; index <= last; ++index){
        array[index] = tempArr[index];
    }
}


void mergeSort(int *array, int first, int last){
    int mid = (first + last) / 2;
    if (first < last){
        mergeSort(array, first, mid);
        mergeSort(array, mid+1, last);

        merge(array, first, mid, last);
    }
}

输入:

array[] = {99, 23, 87, 67, 34, 12, 9, 44, 67, 73, 21, 71, 65, 48, 22, 89, 5, 11, 55, 31, 61, 29, 19, 49, 51};

输出:

19 23 22 22 49 51 51 61 23 22 61 23 22 18894848128 32767 23 1889484128 32767 23 19 23 22 49 51

感谢任何帮助! p.s.这是我第一次发帖,如有格式错误,请见谅。

【问题讨论】:

  • 忠告。重构您的代码以使用半开区间。它使一切变得更加简单。 stackoverflow.com/questions/13066884/…
  • 我突然想到了两件事。首先,您声明临时数组的方式不是标准的。其次,仅从代码来看,您并不能保证您从临时数组中的数据的索引 0 开始,但您总是从零开始处理它。我会为函数编写测试。考虑边缘情况和奇怪的输入。调试代码的最佳方式。
  • 可变大小数组是 g++ 的扩展(来自 C 的保留)。它在 C++ 中是非标准的,但如果人们使用它,它并不是世界末日。

标签: c++ arrays mergesort


【解决方案1】:

您必须从 index = first 而不是 index = 0 复制 tempArr 中的数据。

//assigns sorted values to original array
for(index = first; index <= last; ++index){
    array[index] = tempArr[index];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2022-10-13
    • 2021-02-14
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多