【问题标题】:Selection sort sorting incorrectly选择排序排序不正确
【发布时间】:2020-03-15 05:05:02
【问题描述】:

我正在编写一个选择排序,但它没有正确排序,有时它可以工作,但大多数时候会有一两个数字不合适。它应该打印一个数字数组,对这些数字进行排序,然后再次打印它们。 它在调试模式下工作,但每当我定期运行它时,问题就会开始发生。

注意:如果您想知道为什么开头有一个 while 循环,那是因为我稍后会重复它。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>

int print(int array[4]);

int main(void)
{

    bool loop = true;
    //main loop
    while (loop)
    {
        //array
        int array[5];

        //assign numbers
        int seconds= time(NULL);
        printf("%d\n", seconds);
        srand(seconds);
        for(int i = 0; i <= 4; i++)
        {
            //random number between 0 and 5
            int r = rand();
            array[i] = r % 6;
        }
        //print numbers
        for(int i = 0; i <= 4; i++)
        {
            printf("%d ", array[i]);
        }
        printf("\n");

        //sort 
        int temp;
        for(int i = 0; i <= 4; i++)
        {
            //set minimum
            int min = array[i];
            //check minimum value
            for(int j = i + 1; j <= 4; j++)
            {
                if(min > array[j])
                {
                    min = array[j];
                    temp = j;
                }
            }

            //swap minimum values
            int first = array[i];
            array[i] = min;
            array[temp] = first;
        }
        for(int i = 0; i <= 4; i++)
        {
            printf("%d ", array[i]);
        }
        printf("\n");
        return 0;
    }
}

int print(int array[4])
{
    return 0;
}

样本输出:

1584216938
3 5 1 4 1 
1 1 3 3 4

【问题讨论】:

  • 您的 swap 操作应该位于内部循环内 - 而不是 temp = j; 语句。
  • OT:发布的代码包含一些“神奇”数字。 “魔术”数字是没有基础的数字。 IE。 4, 5. 'magic' numbers 使代码更难理解、调试等。建议使用#define 语句或enum 语句为这些magic 数字赋予有意义的名称,然后在整个代码中使用这些有意义的名称。
  • 循环后交换没问题——选择排序找到剩余数组的最小值,然后交换一次。但是temp 可能未初始化,或者它可能具有旧值。将 temp 设为外循环的本地并将其初始化为 temp = i
  • 编译时,始终启用警告,然后修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -Wconversion -pedantic -std=gnu11)注意:其他编译器使用不同的选项来产生相同的结果
  • OT: about: int seconds= time(NULL); printf("%d\n", seconds); srand(seconds); 这会导致两个编译器警告。建议:unsigned seconds = (unsigned)time(NULL); printf("time: %u\n", seconds); srand(seconds);

标签: c gcc


【解决方案1】:

在外部for 循环中,您设置了初始最小值int min = array[i];,但您忘记设置初始最小值索引(存储在temp 中)。

如果内部for 循环中不满足条件if(min &gt; array[j]),这会导致意外行为。

修复很简单:

        //set minimum
        int min = array[i];
        temp = i; // <---------

【讨论】:

    猜你喜欢
    • 2019-09-16
    • 1970-01-01
    • 2021-09-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多