1
#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 = 0and inner = outerthen both innerand outerequal 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};

見てください...ありがとう

4

2 に答える 2