选择排序
#include <iostream>using namespace std;
int main()
{
int a;
int num;
for (int i = 0; i < 10; i++)
{
cin >> num;
a = num;
}
for (int i = 0; i < 9; i++)
{
int minnum = a;
int index;
bool flag = false;
for (int j = i + 1; j < 10; j++)
{
if (a < minnum)
{
int index = j;
minnum = a;
flag = true;
}
}
if (flag)
{
int temp = a;
a = a;
a = temp;
}
}
for (int i = 0; i < 10; i++)
{
cout << a << endl;
}
return 0;
}这个选择排序为什么不对 问题在于选择排序的实现有一些错误。以下是修正后的代码:
#include <iostream>
using namespace std;
int main()
{
int a;
int num;
for (int i = 0; i < 10; i++)
{
cin >> num;
a[ i] = num;
}
for (int i = 0; i < 9; i++)
{
int minnum = a[ i];
int index = i; // 将index初始化为i
for (int j = i + 1; j < 10; j++)
{
if (a < minnum)
{
minnum = a;
index = j; // 更新index的值
}
}
if (index != i) // 如果index发生了变化,则交换a[ i]和a
{
int temp = a[ i];
a[ i] = a;
a = temp;
}
}
for (int i = 0; i < 10; i++)
{
cout << a[ i] << endl;
}
return 0;
}
修正的地方包括:
1. 在内层循环中,不再需要额外的布尔标志 flag ,直接使用 index 来记录最小值的索引。
2. 修正了 index 的声明和赋值位置,以及交换元素的逻辑。
3. 确保在每次交换前检查 index 是否发生了变化,避免不必要的交换。
这样修改后的代码应该能够正确地实现选择排序算法。 选择排序的问题在于变量index的声明和使用。在您的代码中,您在内层循环中重新声明了一个新的index变量,这导致外层循环无法访问到正确的index值。
为了解决这个问题,您需要将内层循环中的int index = j;修改为index = j;,以便正确更新外层循环中的index变量。修正后的代码如下所示:
#include <iostream>
using namespace std;
int main()
{
int a;
int num;
for (int i = 0; i < 10; i++)
{
cin >> num;
a = num;
}
for (int i = 0; i < 9; i++)
{
int minnum = a;
int index;
bool flag = false;
for (int j = i + 1; j < 10; j++)
{
if (a < minnum)
{
index = j; // 修改此处
minnum = a;
flag = true;
}
}
if (flag)
{
int temp = a;
a = a;
a = temp;
}
}
for (int i = 0; i < 10; i++)
{
cout << a << endl;
}
return 0;
}
请注意,选择排序是一种简单但低效的排序算法。对于大型数据集,更好的选择可能是使用更高效的排序算法,如快速排序或归并排序。
页:
[1]