Два кода, которые должны действовать одинаково, сортируя массив, не - PullRequest
0 голосов
/ 04 апреля 2020

Попытка отсортировать один и тот же массив в порядке возрастания.

Я не вижу разницы между этими двумя кодами. Результаты отличаются, потому что во втором коде наибольшее число сразу идет в последней позиции, в то время как в первом коде наименьшее число идет в первой позиции. Это как противоположный подход. Но я не понимаю, в чем разница в коде, возможно, потому что я новичок ie.

Кроме того, каков лучший код этих двух?

Первый код:

#include <stdio.h>

#define SIZE 10

int main(){
    unsigned int array[] = {3,1,9,6,0,54,4,12,52,44};

    for (unsigned int i=0;i<=SIZE-1;++i){
        for (unsigned int j=i+1;j<=SIZE-1;++j){
            if (array[i] > array[j]){
                int hold = array[i];
                array[i] = array[j];
                array[j] = hold;
            }
        }
        printf("At the @%d pass:\n", i);
        for (unsigned int k=0; k<=SIZE-1; ++k){
            printf("%d\n", array[k]);
        }
        puts("");
    }
}

Выход:

At the @0 pass:
0
3
9
6
1
54
4
12
52
44

At the @1 pass:
0
1
9
6
3
54
4
12
52
44

At the @2 pass:
0
1
3
9
6
54
4
12
52
44

At the @3 pass:
0
1
3
4
9
54
6
12
52
44

At the @4 pass:
0
1
3
4
6
54
9
12
52
44

At the @5 pass:
0
1
3
4
6
9
54
12
52
44

At the @6 pass:
0
1
3
4
6
9
12
54
52
44

At the @7 pass:
0
1
3
4
6
9
12
44
54
52

At the @8 pass:
0
1
3
4
6
9
12
44
52
54

At the @9 pass:
0
1
3
4
6
9
12
44
52
54

Второй код:

#include <stdio.h>

#define SIZE 10

int main(){
    unsigned int array[] = {3,1,9,6,0,54,4,12,52,44};

    for (unsigned int pass=1;pass<SIZE;++pass){
        for (size_t i=0;i < SIZE-1; ++i){
            if (array[i] > array[i+1]){
                int hold = array[i];
                array[i] = array[i+1];
                array[i+1] = hold;
            }
        }
        printf("At the @%d pass:\n", pass);
        for (unsigned int k=0; k<=SIZE-1; ++k){
            printf("%d\n", array[k]);
        }
        puts("");
    }
}

Выход:

At the @1 pass:
1
3
6
0
9
4
12
52
44
54

At the @2 pass:
1
3
0
6
4
9
12
44
52
54

At the @3 pass:
1
0
3
4
6
9
12
44
52
54

At the @4 pass:
0
1
3
4
6
9
12
44
52
54

At the @5 pass:
0
1
3
4
6
9
12
44
52
54

At the @6 pass:
0
1
3
4
6
9
12
44
52
54

At the @7 pass:
0
1
3
4
6
9
12
44
52
54

At the @8 pass:
0
1
3
4
6
9
12
44
52
54

At the @9 pass:
0
1
3
4
6
9
12
44
52
54

1 Ответ

0 голосов
/ 04 апреля 2020

Посмотрите на этот фрагмент первого кода:

    for (unsigned int i=0;i<=SIZE-1;++i){
        for (unsigned int j=i+1;j<=SIZE-1;++j){
            if (array[i] > array[j]){
                int hold = array[i];
                array[i] = array[j];
                array[j] = hold;
            }
        }
        .......

. В этом элемент array[i] выбирается и сравнивается со всеми остальными элементами массива во внутренней l oop, начиная с местоположения i+1. и меняются местами, если он больше, чем любой элемент array[j]. Таким образом, наименьшее число в оставшемся массиве будет go в [i] месте в массиве в каждой итерации. Это выбор сортировки .

Посмотрите на этот фрагмент второго кода:

    for (unsigned int pass=1;pass<SIZE;++pass){
        for (size_t i=0;i < SIZE-1; ++i){
            if (array[i] > array[i+1]){
                int hold = array[i];
                array[i] = array[i+1];
                array[i+1] = hold;
            }
        }
        ......

В этом внутреннем l oop сравните два последовательных элементов и если условие удовлетворяет, то они меняются местами. Это пузырьковая сортировка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...