选择排序程序显示异常结果
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 < n
,以确保循环从头到尾。
【讨论】:
i < 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以上是关于选择排序程序显示异常结果的主要内容,如果未能解决你的问题,请参考以下文章
并发修改异常ConcurrentModificationException