Sortowanie bąbelkowe bez funkcji

0

Cześć, szukam i szukam i nie mogę znaleźć odpowiedzi. Jak zastosować sortowanie bąbelkowe dla losowych liczb w tabeli nie korzystając z żadnych funkcji a jedynie z pętl for, do-while itp.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int liczby[100];
    int magazyn;
    int magazyn_dwa;
    int i,j;
    int zamiana = 0;

    srand(time(NULL));

    for(i=0;i<100;i++){
        liczby[i] = rand() % (100 + 100 + 1) - 100;
    }

    printf("Wylosowane liczby przed sortowaniem:\n");
    for(i=0;i<100;i++){
        printf("NR %d: %d\n",i+1,liczby[i]);
    }

        for(i=0;i<100;i++){
            if(liczby[i] > liczby[i+1]){
                zamiana = 1;
                magazyn = liczby[i];
                magazyn_dwa = liczby[i+1];
                liczby[i] = magazyn_dwa;
                liczby[i+1] = magazyn;
            }
            else if(liczby[i] < liczby[i+1]){
                zamiana = 2;
            }
        }

    printf("Wylosowane liczby posortowane:\n");
    for(i=0;i<100;i++){
        printf("NR %d: %d\n",i+1,liczby[i]);
    }
    
    return 0;
}

Tak, wiem że ta pętla for za bardzo nie ma sensu w tym zadaniu ale już mi łeb paruje

2

No tu nie ma większej filozofii, po prostu musisz przeczytać jak działa algorytm i przepisać każdy krok na kod.
Dam Ci taka radę, że jeden taki for nie wystarczy, bo Ty przechodzisz tylko raz po całej tablicy a potrzebujesz przechodzić do momentu, aż tablica będzie posortowana.

0
Czitels napisał(a):

No tu nie ma większej filozofii, po prostu musisz przeczytać jak działa algorytm i przepisać każdy krok na kod.
Dam Ci taka radę, że jeden taki for nie wystarczy, bo Ty przechodzisz tylko raz po całej tablicy a potrzebujesz przechodzić do momentu, aż tablica będzie posortowana.

Myślałem nad pętlę do-while, w której będzie ten for a pętla do-while będzie się zamykać - właśnie, tylko kiedy

0
Kefor napisał(a):

Myślałem nad pętlę do-while, w której będzie ten for a pętla do-while będzie się zamykać - właśnie, tylko kiedy

W sortowaniu bombelkowym używa się guarda, czyli sprawdzasz czy został przy przejściu całej tablicy chociaż jeden element zmieniony, jak nie został żaden zmieniony to znaczy, że tablica posortowana.
Jak wykonujesz zamianę miejscami to oznaczasz jako, że została tablica zmodyfikowana i na początku przed zaczęciem przejścia tablicy zerujesz guarda np. na false, a przy modyfikacji na true.

I w warunku while możesz sprawdzać tego guarda czy kontynuować jak true i wyjść jak false.

0
fdsa napisał(a):
Kefor napisał(a):

Myślałem nad pętlę do-while, w której będzie ten for a pętla do-while będzie się zamykać - właśnie, tylko kiedy

W sortowaniu bombelkowym używa się guarda, czyli sprawdzasz czy został przy przejściu całej tablicy chociaż jeden element zmieniony, jak nie został żaden zmieniony to znaczy, że tablica posortowana.
Jak wykonujesz zamianę miejscami to oznaczasz jako, że została tablica zmodyfikowana i na początku przed zaczęciem przejścia tablicy zerujesz guarda np. na false, a przy modyfikacji na true.

I w warunku while możesz sprawdzać tego guarda czy kontynuować jak true i wyjść jak false.

Myślałem na zasadzie dodania zmiennej "zamiana" jeśli pętla zareaguje to ustawia się na wartość "zamiana = 1" jesli nie reaguje to "zamiana = 0" do {}while(zamiana == 0), coś w ten deseń?

1

Miałeś już wyżej powiedziane, że musisz użyć dwóch pętli FOR. Jak chcesz sortowania w drugą stronę, trzeba to lekko zmodyfikować. Ale to już się sam pobaw.

int temp, n = 100;
  for(int i = 0; i < n; i++)
  {
	for(int j = 0; j < n - 1; j++)
	{
	  if(liczby[j] < liczby[j + 1])
	  {
	   temp = liczby[j + 1];
	   liczby[j + 1] = liczby[j];
	   liczby[j] = temp;
	  }
	}
  }
0
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int liczby[100];
    int magazyn;
    int magazyn_dwa;
    int i, j;
    int zamiana;

    srand(time(NULL));

    for (i = 0; i < 100; i++)
    {
        liczby[i] = rand() % (100 + 100 + 1) - 100;
    }

    printf("Wylosowane liczby przed sortowaniem:\n");
    for (i = 0; i < 100; i++)
    {
        printf("NR %d: %d\n", i + 1, liczby[i]);
    }

    int swapped; // 

    do
    {
        swapped = 0; // 

        for (i = 0; i < 100 - 1; i++)
        {
            if (liczby[i] > liczby[i + 1])
            {
                zamiana = 1;
                magazyn = liczby[i];
                magazyn_dwa = liczby[i + 1];
                liczby[i] = magazyn_dwa;
                liczby[i + 1] = magazyn;
                swapped = 1; // 
            }
        }
    } while (swapped); // 

    printf("Wylosowane liczby posortowane:\n");
    for (i = 0; i < 100; i++)
    {
        printf("NR %d: %d\n", i + 1, liczby[i]);
    }

    return 0;
}
3
Kefor napisał(a):

... nie korzystając z żadnych funkcji a jedynie z pętl for, do-while itp....

Nie ma to jak sobie utrudniać i uczyć się złych praktyk.
Jeśli nauczyciel ci to narzucił to ograniczenie, to zły nauczyciel.
Jeśli sam wpadłeś na takie ograniczenie, znaczy, że reagujesz strachem na bardzo ważne funkcjonalności języka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1