选择排序程序显示异常结果

时间:2016-02-20 07:34:48

标签: c++ algorithm sorting math

我用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

4 个答案:

答案 0 :(得分:2)

内循环肯定是错误的:

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了解伪代码以及关于不同类型数据的精美动画演示。

答案 1 :(得分:0)

在排序循环的内部循环中,您写了:for( int j = 1; ...)
现在,每次,内循环 1变为n-1 ,而是从 i + 1变为n-1
因此,将循环更改为for( int j = i+1; ...)

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

答案 2 :(得分:0)

我已检查过您的代码,并且您在选择排序成功时遇到逻辑错误。在内部循环中,内部循环的初始化始终为j = 1。这应该改为:

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

并将外部循环的条件值更改为i < n以确保循环从开始到结束。

答案 3 :(得分:0)

内循环应为

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

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

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