鱼C论坛

 找回密码
 立即注册
查看: 550|回复: 2

[已解决]选择排序

[复制链接]
发表于 2023-11-20 08:43:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
using namespace std;
int main()
{
        int a[10];
        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;
                bool flag = false;
                for (int j = i + 1; j < 10; j++)
                {
                        if (a[j] < minnum)
                        {
                                int index = j;
                                minnum = a[j];
                                flag = true;
                        }
                }
                if (flag)
                {
                        int temp = a[i];
                        a[i] = a[index];
                        a[index] = temp;
                }
        }
        for (int i = 0; i < 10; i++)
        {
                cout << a[i] << endl;
        }
        return 0;
}这个选择排序为什么不对
最佳答案
2023-11-20 08:43:11
问题在于选择排序的实现有一些错误。以下是修正后的代码:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.         int a[10];
  6.         int num;
  7.         for (int i = 0; i < 10; i++)
  8.         {
  9.                 cin >> num;
  10.                 a[ i] = num;
  11.         }
  12.         for (int i = 0; i < 9; i++)
  13.         {
  14.                 int minnum = a[ i];
  15.                 int index = i; // 将index初始化为i
  16.                 for (int j = i + 1; j < 10; j++)
  17.                 {
  18.                         if (a[j] < minnum)
  19.                         {
  20.                                 minnum = a[j];
  21.                                 index = j; // 更新index的值
  22.                         }
  23.                 }
  24.                 if (index != i) // 如果index发生了变化,则交换a[ i]和a[index]
  25.                 {
  26.                         int temp = a[ i];
  27.                         a[ i] = a[index];
  28.                         a[index] = temp;
  29.                 }
  30.         }
  31.         for (int i = 0; i < 10; i++)
  32.         {
  33.                 cout << a[ i] << endl;
  34.         }
  35.         return 0;
  36. }
复制代码


修正的地方包括:
1. 在内层循环中,不再需要额外的布尔标志 flag ,直接使用 index 来记录最小值的索引。
2. 修正了 index 的声明和赋值位置,以及交换元素的逻辑。
3. 确保在每次交换前检查 index 是否发生了变化,避免不必要的交换。

这样修改后的代码应该能够正确地实现选择排序算法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-20 08:43:11 | 显示全部楼层    本楼为最佳答案   
问题在于选择排序的实现有一些错误。以下是修正后的代码:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.         int a[10];
  6.         int num;
  7.         for (int i = 0; i < 10; i++)
  8.         {
  9.                 cin >> num;
  10.                 a[ i] = num;
  11.         }
  12.         for (int i = 0; i < 9; i++)
  13.         {
  14.                 int minnum = a[ i];
  15.                 int index = i; // 将index初始化为i
  16.                 for (int j = i + 1; j < 10; j++)
  17.                 {
  18.                         if (a[j] < minnum)
  19.                         {
  20.                                 minnum = a[j];
  21.                                 index = j; // 更新index的值
  22.                         }
  23.                 }
  24.                 if (index != i) // 如果index发生了变化,则交换a[ i]和a[index]
  25.                 {
  26.                         int temp = a[ i];
  27.                         a[ i] = a[index];
  28.                         a[index] = temp;
  29.                 }
  30.         }
  31.         for (int i = 0; i < 10; i++)
  32.         {
  33.                 cout << a[ i] << endl;
  34.         }
  35.         return 0;
  36. }
复制代码


修正的地方包括:
1. 在内层循环中,不再需要额外的布尔标志 flag ,直接使用 index 来记录最小值的索引。
2. 修正了 index 的声明和赋值位置,以及交换元素的逻辑。
3. 确保在每次交换前检查 index 是否发生了变化,避免不必要的交换。

这样修改后的代码应该能够正确地实现选择排序算法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-20 08:45:19 | 显示全部楼层
选择排序的问题在于变量index的声明和使用。在您的代码中,您在内层循环中重新声明了一个新的index变量,这导致外层循环无法访问到正确的index值。

为了解决这个问题,您需要将内层循环中的int index = j;修改为index = j;,以便正确更新外层循环中的index变量。修正后的代码如下所示:
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     int a[10];
  6.     int num;
  7.     for (int i = 0; i < 10; i++)
  8.     {
  9.         cin >> num;
  10.         a[i] = num;
  11.     }
  12.     for (int i = 0; i < 9; i++)
  13.     {
  14.         int minnum = a[i];
  15.         int index;
  16.         bool flag = false;
  17.         for (int j = i + 1; j < 10; j++)
  18.         {
  19.             if (a[j] < minnum)
  20.             {
  21.                 index = j; // 修改此处
  22.                 minnum = a[j];
  23.                 flag = true;
  24.             }
  25.         }
  26.         if (flag)
  27.         {
  28.             int temp = a[i];
  29.             a[i] = a[index];
  30.             a[index] = temp;
  31.         }
  32.     }
  33.     for (int i = 0; i < 10; i++)
  34.     {
  35.         cout << a[i] << endl;
  36.     }
  37.     return 0;
  38. }
复制代码

请注意,选择排序是一种简单但低效的排序算法。对于大型数据集,更好的选择可能是使用更高效的排序算法,如快速排序或归并排序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-5 17:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表