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

Posted

技术标签:

【中文标题】选择排序程序显示异常结果【英文标题】: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 在调试器中逐步执行此操作,并找出它在哪一点没有按照您的预期执行。 【参考方案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

以上是关于选择排序程序显示异常结果的主要内容,如果未能解决你的问题,请参考以下文章

并发修改异常ConcurrentModificationException

Ember power选择对表格结果进行排序

经典算法动画解析系列:选择排序

计数、排序 desc 并选择 ASP.NET 的前 4 个值

javascript选择排序法

c语言冒泡排序最终结果错误