Пузырьковая сортировка в C - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь запрограммировать алгоритм сортировки Bubble на языке C для практики и пересмотра, однако я столкнулся с несколькими проблемами: я пытаюсь распечатать каждый своп после каждой итерации в массиве из 20 случайных чисел, однако, программа, кажется, по какой-то причине избавляется от элементов, которые больше, чем элемент ранее.

Вот код:

int i, j, temp;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72, 
88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
    printf("|%d", SortData[i]);
}
printf("|");
printf("\n");

 for (i=0; i<19; i++)
    {
        for(j=0;j<18;j++){
        if(SortData[j]>SortData[j+1])
        {
            temp = SortData[j];
            SortData[j]=SortData[j+1];
            SortData[j+1]=temp;
            printf("|%d", SortData[j]);
        }

    }
    printf("\n");
    }
    printf("\n");
system("pause");
return 0;

А вот что происходит при запуске этого кода:

|20|43|90|17|2|4|67|54|0|44|78|89|21|45|72|88|65|100|97|25|
|17|2|4|67|54|0|44|78|89|21|45|72|88|65|97
|17|2|4|54|0|44|21|45|72|88|65
|17|2|4|0|44|21|45|72|65
|2|4|0|21|45|65
|0|21|45|65
|0|21|65
|0|21
|0

Process returned 10 (0xA)   execution time : 3.072 s
Press any key to continue.

Более того, я провел несколько тестов, чтобы проверить, была ли ошибка при сортировке массива или при его печати, вот результаты этого теста:

int i, j, temp;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72, 
88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
    printf("|%d", SortData[i]);
}
printf("|");
printf("\n");

 for (i=0; i<19; i++)
    {
        for(j=0;j<18;j++){
        if(SortData[j]>SortData[j+1])
        {
            temp = SortData[j];
            SortData[j]=SortData[j+1];
            SortData[j+1]=temp;

        }

    }
    }
    for (i=0; i<20; i++){
        printf("|%d", SortData[i]);//Error here as 25 isn't sorted
    }
    printf("|");
    printf("\n");
system("pause");
return 0;

Единственное изменение в этом фрагменте по сравнению с приведенным выше состоит в том, что оператор печати выходит из вложенного цикла for и печатается с использованием отдельного цикла for, этот тип работает, так как числа отсортированы, но по какой-то причине 25 нет. 't:

|20|43|90|17|2|4|67|54|0|44|78|89|21|45|72|88|65|100|97|25|
|0|2|4|17|20|21|43|44|45|54|65|67|72|78|88|89|90|97|100|25|
Press any key to continue . . .

Так что получается, что есть проблема с сортировкой и печатью. Могу ли я получить несколько советов о том, как напечатать каждую итерацию подкачки и как правильно ее поменять?

UPDATE:

Итак, я увеличил счетчики циклов на вложенный цикл for, и теперь он сортирует массив и показывает каждую итерацию. Вот как выглядит измененный код:

int i, j, temp;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72, 88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
    printf("|%d", SortData[i]);
}
printf("|");
printf("\n");

 for (i=0; i<20; i++)
    {
        for(j=0;j<19;j++){
        if(SortData[j]>SortData[j+1])
        {
            temp = SortData[j];
            SortData[j]=SortData[j+1];
            SortData[j+1]=temp;

        }
            printf("|%d", SortData[j]);//Changed code
    }
        printf("\n");
    }
    //for (i=0; i<20; i++){
      //  printf("|%d", SortData[i]);//Error here as 25 isn't sorted
    //}
    printf("|");
    printf("\n");
system("pause");
return 0;

Теперь он показывает каждую итерацию и сортирует ее, но по какой-то причине число 100 исчезает из массива и, таким образом, оно сортирует только 19 элементов, а не 20:

|20|43|90|17|2|4|67|54|0|44|78|89|21|45|72|88|65|100|97|25|
|20|43|17|2|4|67|54|0|44|78|89|21|45|72|88|65|90|97|25
|20|17|2|4|43|54|0|44|67|78|21|45|72|88|65|89|90|25|97
|17|2|4|20|43|0|44|54|67|21|45|72|78|65|88|89|25|90|97
|2|4|17|20|0|43|44|54|21|45|67|72|65|78|88|25|89|90|97
|2|4|17|0|20|43|44|21|45|54|67|65|72|78|25|88|89|90|97
|2|4|0|17|20|43|21|44|45|54|65|67|72|25|78|88|89|90|97
|2|0|4|17|20|21|43|44|45|54|65|67|25|72|78|88|89|90|97
|0|2|4|17|20|21|43|44|45|54|65|25|67|72|78|88|89|90|97
|0|2|4|17|20|21|43|44|45|54|25|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|43|44|45|25|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|43|44|25|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|43|25|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|0|2|4|17|20|21|25|43|44|45|54|65|67|72|78|88|89|90|97
|

Press any key to continue . . .

Почему 100 исчезает?

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

в строке 11 фрагмента кода, который вы вставили, вы используете только первые 19 записей для сортировки. Установите этот код на 20 и решите.

Я комментирую строку, где я исправляю.

Совет: Возможно, вы только начинаете разработку программного обеспечения, и для этого типа случаев было бы интересно узнать, как использовать отладку.

int i, j, temp;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72, 
88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
    printf("|%d", SortData[i]);
}
printf("|");
printf("\n");

// before > for (i=0; i<19; i++)
 for (i=0; i<20; i++)
    {
// before > for(j=0;j<18;j++){
    for(j=0;j<19;j++){
        if(SortData[j]>SortData[j+1])
        {
            temp = SortData[j];
            SortData[j]=SortData[j+1];
            SortData[j+1]=temp;

        }

    }
    }
    for (i=0; i<20; i++){
        printf("|%d", SortData[i]);//Error here as 25 isn't sorted
    }
    printf("|");
    printf("\n");
system("pause");
return 0;
0 голосов
/ 04 сентября 2018

Вы просто пропускаете последний номер, когда используете цикл. Запустите цикл for для i <20 вместо i <19, потому что он пропускает последнее число при сортировке. </p>

0 голосов
/ 04 сентября 2018

Это отлично работает, вы сделали небольшую ошибку:

int i, j, temp;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72, 88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
    printf("|%d", SortData[i]);
}
printf("|");
printf("\n");
//before for(i=0; i<19; i++)
for (i=0; i<20; i++)// i < 20 or it will skip the last number
{
    //before for(j=0; j<18; j++)
    for(j=0;j<19;j++){
        if(SortData[j]>SortData[j+1])
        {
        temp = SortData[j];
        SortData[j]=SortData[j+1];
        SortData[j+1]=temp;
        }

    }
}
for (i=0; i<20; i++){
    printf("|%d", SortData[i]);
}
printf("|");
printf("\n");
return 0;

Если вы хотите напечатать каждую итерацию сортировки пузырьков, это код:

int i, j, temp, h;
int SortData[20]= {20, 43, 90, 17, 2, 4, 67, 54, 0, 44, 78, 89, 21, 45, 72, 88, 65, 100, 97, 25};
for(i=0; i<20; i++)
{
    printf("|%d", SortData[i]);
}
printf("|");
printf("\n");

for (i=0; i<20; i++)
{
    for(j=0;j<19;j++){
        if(SortData[j]>SortData[j+1])
        {
            temp = SortData[j];
            SortData[j]=SortData[j+1];
            SortData[j+1]=temp;
            for (h=0; h<20; h++)
            {
                printf("|%d", SortData[h]);
            }
            printf("|");
            printf("\n");
        }
    }
}
return 0;
}
...