【发布时间】:2018-01-07 23:58:54
【问题描述】:
我有以下尝试在 C++ 中编写选择排序:
#include <iostream>
using namespace std;
int main()
{
int a[10], k, i, j, n, aux;
cin >> n;
for (i = 0; i <= n-1; i++)
cin >> a[i];
k = a[0];
for (i = 0; i <= n - 2; i++) {
for (j = i + 1; j <= n-1; j++)
if (k > a[j])
k = a[j];
for (j = i + 1; j <= n-1; j++)
if (k == a[j]) {
aux = a[i];
a[i] = a[j];
a[j] = aux;
}
k = a[i + 1];
}
for (i = 0; i <= n-1; i++)
cout << a[i];
return 0;
}
根据我的测试,它返回排序后的数组,所以我认为它是正确的。
但我还必须解释为什么排序的主 for 循环只需要 n-1 步而不是 n。谁能向我解释“为什么”部分?
【问题讨论】:
-
在
C++数组索引从0到n-1所以你的循环应该做同样的事情:for(int i = 0; i < n; ++i) ... -
如果
n为 10,则在第一个读取循环中覆盖数组的边界。 -
@PaulMcKenzie 我刚刚输入了一个随机数字,我知道 10 对于大多数情况来说太小了。
-
不,我想说的是 Galik 所说的。数组的索引从 0 开始,而不是 1。当
n为0时,在该循环的最后一次迭代中写入a[n]会覆盖内存。 -
@BiancaStan 你的学校错了。 C++ 中的数组从 0 开始。越界访问数组不仅是错误的,而且是内存覆盖,在某些情况下会导致安全漏洞。
标签: c++ sorting c++11 selection-sort