黎子卿 发表于 2023-11-20 08:43:00

选择排序

#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;
}这个选择排序为什么不对

isdkz 发表于 2023-11-20 08:43:11

问题在于选择排序的实现有一些错误。以下是修正后的代码:

#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 是否发生了变化,避免不必要的交换。

这样修改后的代码应该能够正确地实现选择排序算法。

Mike_python小 发表于 2023-11-20 08:45:19

选择排序的问题在于变量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]
查看完整版本: 选择排序