#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
int ctr, inner, outer, didSwap, temp;
int nums[10];
time_t t;
srand(time(&t));
for (ctr = 0; ctr < 10; ctr++)
{
nums[ctr] = (rand() % 99) + 1;
}
puts("\nHere is the list before the sort:"); for (ctr=0; ctr < 10; ctr++) {
printf("%d\n", nums[ctr]); }
for(outer = 0; outer < 9; outer++) {
didSwap = 0;
for (inner = outer; inner < 10; inner++)
{
if (nums[inner] < nums[outer])
{
temp = nums[inner];
nums[inner] = nums[outer];
nums[outer] = temp;
didSwap = 1;
}
}
if (didSwap == 0)
{
break;
}
}
puts("\nHere is the list after the sort:"); for(ctr = 0; ctr < 10; ctr++) {
printf("%d\n", nums[ctr]);
}
return 0;
}
この部分がわかりません:
for(outer = 0; outer < 9; outer++) {
didSwap = 0;
for (inner = outer; inner < 10; inner++) {
if (nums[inner] < nums[outer])
...
}
}
If outer = 0
and inner = outer
then both inner
and outer
equal to 0. そしてループ FOR が言う場合、if (nums[inner] < nums[outer])
内側と外側の両方が 0 であるため、どのように nums[0] が nums[0] よりも小さくなる可能性がありますか? 理解するのを手伝ってください。
皆さん、教科書のコードが間違っていると思います。どう思いますか?
問題はBREAKにあります。適切な場所にあると思いますか。
if (didSwap == 0) { ブレーク; }
ここでの問題は、最初の 2 つの配列値が昇順であり、残りのNUMS[]要素がランダムである場合、内側のループの最初の繰り返しの後、 didSwap がまだゼロに等しいため、外側のループが中断されることです。 .
このようにNUMS[]を手動で初期化しようとしました..
int nums[10]={4,6,8,65,47,74,21,22,65,36};
見てください...ありがとう