【发布时间】:2021-05-02 15:41:06
【问题描述】:
我正在使用归并排序来对我的数组进行降序处理。我的第一个元素改变了他的值的原因是什么? 我的一半代码有效。但是我的第一个和最后一个元素出了点问题。
#include <iostream>
void Merge(int a[], int low, int high, int mid)
{
int i = low, j = mid + 1, k = 0;
int temp[high - low + 1];
while (i <= mid && j <= high) {
if (a[i] > a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}
while (i <= mid) {
temp[k++] = a[i++];
}
while (j <= high) {
temp[k++] = a[j++];
}
for (i = low; i <= high; i++) {
a[i] = temp[i - low];
}
return;
}
void MergeSort(int a[], int low, int high)
{
int mid;
if (low < high) {
mid = (low + high) / 2;
MergeSort(a, low, mid);
MergeSort(a, mid + 1, high);
Merge(a, low, high, mid);
}
return;
}
void output(int* a, int n)
{
for (int i = 0; i < n; i++) {
std::cout << a[i] << "\t";
}
}
int main()
{
int n;
std::cin >> n;
int a[n];
for (int i = 0; i < n; i++) {
std::cin >> a[i];
}
MergeSort(a, 0, n);
output(a, n);
}
输出必须是这个。
输入 10
1 2 3 4 5 6 7 8 9 10
输出
10 9 8 7 6 5 4 3 2 1
但我明白了 输出
4197055 10 9 8 7 6 5 4 3 2
我是 C++ 的初学者。所以如果你能帮助我在这里完成我的第一步,我会很高兴。
【问题讨论】:
-
此代码似乎工作,无法重现。 godbolt.org/z/nPqhn3
-
@foragerDev 不,它不起作用godbolt.org/z/G9GPnv 未定义行为的经典示例。 (带有 gcc 的 godblot 能够显示行号:godbolt.org/z/1M7vrj)
-
@MarekR 在我的机器上,我不明白。
-
@foragerDev 再次这是未定义的行为,因此它可能会崩溃它可能什么都不做它可能会打印 tash。请注意,唯一的区别是我启用了地址清理程序。
-
您将
n传递为high。但是n比最高元素的索引高一个,这会导致未定义的行为。MergeSort(a,0,n-1);将解决问题。
标签: c++ sorting merge conditional-statements output