【问题标题】:Why does the for loop in selection sort have n-1 steps instead of n? C++为什么选择排序中的for循环有n-1步而不是n? C++
【发布时间】: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++ 数组索引从0n-1 所以你的循环应该做同样的事情:for(int i = 0; i &lt; n; ++i) ...
  • 如果 n 为 10,则在第一个读取循环中覆盖数组的边界。
  • @PaulMcKenzie 我刚刚输入了一个随机数字,我知道 10 对于大多数情况来说太小了。
  • 不,我想说的是 Galik 所说的。数组的索引从 0 开始,而不是 1。当 n0 时,在该循环的最后一次迭代中写入 a[n] 会覆盖内存。
  • @BiancaStan 你的学校错了。 C++ 中的数组从 0 开始。越界访问数组不仅是错误的,而且是内存覆盖,在某些情况下会导致安全漏洞。

标签: c++ sorting c++11 selection-sort


【解决方案1】:

如果n 为 1,请考虑需要多少步。

基本上,您不需要对第一个元素进行排序。

【讨论】:

    【解决方案2】:

    排序是通过比较元素的来完成的。

    N 个元素的数组中有多少对? (提示:N-1)

    This animation 可能有助于解释该算法的工作原理。

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2014-10-26
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      相关资源
      最近更新 更多