【问题标题】:Selection Sorting program showing abnormal results选择排序程序显示异常结果
【发布时间】:2016-02-20 07:34:47
【问题描述】:

我用 C++ 编写了一个选择排序程序。我已经检查并重新检查了代码,但逻辑非常好。但是代码没有正确排序数组:

    // Selection Sort

#include <iostream>

using namespace std;

inline void swap( int& x, int& y) {
    int temp = x;
    x = y;
    y = temp;
}

int main() {
    const int n = 10;
    int list[n];

    string line(14, '-');
    cout << '\n' << line << "\nSelection Sort\n" << line << '\n';
    cout << "Enter " << n << " elements:\n";

    for( int i = 0; i < n; ++i ) {
        cin >> list[i];
    }

    for( int i = 0; i < n-1; ++i ) {
        int small = i;
        for( int j = 1; j < n; ++j ) {
            if( list[j] < list[small] ) {
                small = j;
            }
        }
        if( list[small] < list[i] ) {
            swap( list[i], list[small]);
        }
    }

    cout << "Sorted Array:\n";
    for( int i = 0; i < n; ++i ) {
        cout << list[i] << ' ';
    }

    return 0;
}

我哪里错了?选择排序的算法在这里给出:Selection Sort- wikipedia

10 个数字的示例输入:

7 8 9 10 11 12 13 14 15 16

输出:

7 9 10 11 12 13 14 15 8 16

【问题讨论】:

  • 从技术上讲,您的程序不是有效的 C++ 程序,因为 C++ 没有 variable-length arrays。如果您想要一个在运行时设置大小的“数组”,请使用std::vector
  • 在调试器中逐步执行此操作,并找出它在哪一点没有按照您的预期执行。

标签: c++ algorithm sorting math


【解决方案1】:

这里的内部循环肯定是错误的:

for( int j = 1; j < n; ++j ) {

应该是

for( int j = i+1; j < n; ++j ) {

还有循环结束的条件

if( list[small] < list[i] ) {
    swap( list[i], list[small]);
}

过分了。内循环退出后按定义满足。

请参阅:Sorting algorithms - selection sort 获取伪代码和关于不同类型数据的精美动画演示。

【讨论】:

    【解决方案2】:

    在排序循环的内部循环中,你写了:for( int j = 1; ...)
    现在,每次,内部循环不是1 到 n-1,而是从 i+1 到 n-1 >
    所以把循环改成for( int j = i+1; ...)

    此外,您可以将交换条件更改为 small != i,但这是可选的。

    【讨论】:

      【解决方案3】:

      我检查了您的代码,但您有一个逻辑错误,选择排序成功。在内循环中,内循环的初始化总是j = 1。这应该更改为:

      for( int j = i+1; j < n; ++j ) {
              if( list[j] < list[small] ) {
                  small = j;
              }
      }
      

      并将外部循环的条件值更改为i &lt; n,以确保循环从头到尾。

      【讨论】:

      • i &lt; n 不是必需的,因为 i==n-1 内部循环将遍历单个元素,这没有什么意义。
      【解决方案4】:

      内循环应该是

        for(j=i+1;j<n;j++)
        {
          if( list[j] < list[small] ) {
              small = j;
          }
        }
      

      如果它们小不等于 I 变量则交换

        if(small != i)
        {
         swap();
        }
      

      【讨论】:

      • 错误,请参阅sorting-algorithms.com/selection-sort。内部循环从 past-the-i 元素迭代到数组的末尾。直到i 的数组已经排序。
      • 我试试这就是我给出答案的原因,有很多方法可以做任何代码,不要只依赖一个
      • 称为“选择排序”的算法定义明确。请参阅coliru.stacked-crooked.com/a/37a59d3fda61b676:您的代码与 OP 的失败方式相同。
      • 你为什么不尝试整个代码?然后告诉我区别?
      • #include 使用命名空间标准; int main() { int arr[5],i,j,temp,min; for(i=0;i>arr[i]; } coutarr[min]) min=j; } if(min!=i) { temp=arr[i]; arr[i]=arr[分钟]; arr[min]=温度; } } cout
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多