我用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
答案 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();
}