【发布时间】: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);