【发布时间】:2022-01-16 11:39:44
【问题描述】:
void swap(int a[], int x, int y)
{
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
void sort(int arr[], int x)
{
static int count = 0;
if (x == 1)
{
return;
}
int min = 100; // random value
int index;
for (int i = 0; i < x; i++)
{
if (arr[i] < min)
{
min = arr[i];
index = i;
}
}
swap(arr, count, index);
count++;
sort(arr + 1, x - 1);
}
int main()
{
int x;
cin >> x;
int A[x];
for (int i = 0; i < x; i++)
{
cin >> A[i];
}
sort(A, x);
for (int i = 0; i < x; i++)
{
cout << A[i] << " ";
}
cout << endl;
return 0;
}
此代码是使用递归的选择排序。它正在打印垃圾值。这有什么错误。我不确定,但我猜是因为在排序函数()中使用了静态变量。它正在打印垃圾值
【问题讨论】:
-
仅供参考,variable length arrays 像
int A[x];在标准 C++ 中是不合法的。只有对 C++ 语言的非标准编译器扩展才能使用这样的构造。另外,re: 初始化min到-1并带有注释“随机值,因为给定的数组有正元素”,(positive element) < min什么时候是真的? -
使用静态变量无法调用该函数两次。为什么不声明
sort(int arr[], int first, int last)? -
只需删除计数及其任何用法。你已经做了 arr + 1 和 count 使交换 min 与 arr + 1 + count 导致一半的尝试访问数组外。
-
“随机值”评论让我想起了来自 badcode 网站或类似的东西..
const int rnd = 13; // a random value obtained by throwing a d20 dice -
不要在不需要递归的地方使用递归(例如在这种情况下)。这样就可以避免大部分问题。此外,切勿使用
static局部变量,除非您 (a) 非常准确地知道自己在做什么,或者 (b) 同时讨厌递归和多线程。
标签: c++ sorting recursion selection-sort function-definition