logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Sortowanie bąbelkowe w C bez użycia swap - jak poprawić kod?

bardzociekawski 31 Mar 2006 12:59 3612 12
REKLAMA
  • #1 2477948
    bardzociekawski
    Uczeń
    Posty: 63
    Chcę napisać większy programik, którego częścią jest sortowanie bąbelkowe i na tym sortowaniu UTKNĄŁEM - program ma działać w ten sposób :
    użytkownik podaje 5 liczb całkowitych, program sortuje elementy rosnąco i wyświetla je już w kolejności rosnącej
    Program ma być w C
    najlepiej żeby był tak prosty jak mój czyli bez uzycia, np. "swapa" jesli idzie o zamianę elementów miejscami w tablicy
    NO I PROGRAM PO POSORTOWANIU MUSI ZAPAMIĘTAĆ TE 5 POSORTOWANYCH LICZB JAKO "tab3" - bo to tylko fragment programu i potem będę używał "tab3" - powiedzcie co mam źle bo coś jest nie tak:
    //program segreguje elementy w tablicy rosnąco-sortowanie babelkowe
    //y-liczba przebiegów tablicy

    #include<conio.h>
    #include<stdio.h>
    int czytaj1 (int tab1[]);
    int sortowanie(int tab3[], int tab1[]);
    int main()
    {
    int tab1[5], tab3[5];
    czytaj1(tab1);
    sortowanie(tab3, tab1);
    getch ();
    return 0;
    }


    int czytaj1 (int tab1[])
    {
    int i;
    printf ("podaj 5 liczb calkowitych: \n");
    for(i=0; i<5; i++)
    scanf("%d", tab1+i);
    }



    int sortowanie (int tab3[], int tab1[])
    {
    int i, y, pom;
    for (y=0; y<4; y++)
    {
    for(i=0; i<4; i++)
    {
    if(tab1[i+1]>tab1[i])
    {
    pom=tab1[i];
    tab1[i]=tab1[i+1];
    tab1[i+1]=pom;
    }
    printf ("%d ", tab1[i]);
    }
    }
    }
    (:((((((((() – ozdobnik ? [h]
  • REKLAMA
  • #2 2478010
    kordan11
    Poziom 18  
    Posty: 241
    Pomógł: 24
    Ocena: 10
    Cytat:
    int sortowanie (int tab3[], int tab1[])
    {
    int i, y, pom;
    for (y=0; y<4; y++)
    {
    for(i=0; i<4; i++)
    {
    if(tab1[i+1]>tab1[i])
    {
    pom=tab1[i];
    tab1[i]=tab1[i+1];
    tab1[i+1]=pom;
    }

    powinno być
    int sortowanie (int tab3[], int tab1[])
    {
    int i, y, pom;
    for (y=0; y<4; y++)
    {
    for(i=0; i<4; i++)
    {
    if(tab1[y]>tab1[i])
    {
    pom=tab1[i];
    tab1[i]=tab1[y];
    tab1[y]=pom;
    }

    Sprawdź tylko znak porównania bo niejestem pewien
  • #3 2478015
    bardzociekawski
    Uczeń
    Posty: 63
    nie, to co napisałeś jest źle niestety :/
  • REKLAMA
  • #4 2478076
    black80
    Poziom 10  
    Posty: 59
    Pomógł: 1
    A może zamiast
    Cytat:
    if(tab1[i+1]>tab1[i])
    powinno być if(tab1[i+1]<tab1[i]) ??
  • #5 2478109
    bardzociekawski
    Uczeń
    Posty: 63
    black80 zmieniłem na to co mówisz - podałem liczby: 5 4 3 2 1
    a program mi po posortowaniu wyświetlił:
    4 3 2 1 3 2 1 4 2 1 3 4 1 2 3 4
    no końcówka tego ciągu liczb by się zgadzała mniej więcej bo brak jest jeszcze "5" no i jak zrobic gdzie printa wstawic zeby mi wyswietlalo tylko koncowke?
  • REKLAMA
  • #6 2478140
    hogan
    Poziom 12  
    Posty: 7
    Pomógł: 2
    Masz funkcje sortowanie. W tab1 pozostana nieposortowane jak ma byc inaczej to pisz, aha czytaj1 i sortowanie powinny byc typu void.

    void sortowanie (int tab3[], int tab1[])
    {
            int i, y, pom;
            for(i=0;i!=5;i++)
            {
                tab3[i]=tab1[i];
            }
            for (i=0; y!=0; i=0)
            {
                    for(y=0; i!=5; i++)
                    {
                            if(tab3[i+1]<tab3[i])
                            {
                                    pom=tab3[i];
                                    tab3[i]=tab3[i+1];
                                    tab3[i+1]=pom;
                                    y++;
                            }
                    }
            }
            for(i=0;i!=5;i++)
            {
                printf ("%d ", tab3[i]);
            }
    }
    
  • #7 2478218
    black80
    Poziom 10  
    Posty: 59
    Pomógł: 1
    żeby wyświetlało końcówke trzebaby chyba wstawić printf'a o jeden '}' niżej

    Dodano po 3 [minuty]:

    a co do tej 5ki to nie jestem pewien ale może zamiast
    Cytat:
    for(i=0; i<4; i++)
    wstaw for(i=0; i<5; i++)
  • Pomocny post
    #8 2478259
    hogan
    Poziom 12  
    Posty: 7
    Pomógł: 2
    W tym co ja podałem sortuje do piatki i wyswietla tylko koncowke.
  • #9 2478290
    bardzociekawski
    Uczeń
    Posty: 63
    dzięki hogan działa wyśmienicie :D
  • Pomocny post
    #10 2478334
    wiso
    Poziom 15  
    Posty: 92
    Pomógł: 12
    Ocena: 2
    nie wiem po co jest tobie tab3 no ale coz, moze to byc np. tak

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    // liczba elementow uzywana w tablicy tab[]
    #define LICZBA_ELEM 5
    
    void sortuj_babelkowo(int tab[], int n)
    void pobierz_dane(int tab[], int n)
    void wyswietl_dane(int tab[], int n)
    void przepisz_dane(int tab3[], int tab1[], int n);
    
    int main(int argc, char *argv[])
    {
        int tab1[LICZBA_ELEM];
        int tab1[LICZBA_ELEM];
        int i;
    
        // pobierz dane od uzytkownika
        pobierz_dane(tab1, LICZBA_ELEM);
    
        // sortuj tabele metoda babelkowa
        sortuj_babelkowo(tab1, LICZBA_ELEM);
    
        // wyswietl posortowane elementy
        wyswietl_dane(tab1, LICZBA_ELEM);
    
        // przepisz dane z tab1 do tab3
        przepisz_dane(tab3, tab1, LICZBA_ELEM);
    
        // zrob co zechcesz z tab3
    
        getch();
        return(0);
    } 
    
    void sortuj_babelkowo(int tab[], int n)
    {
        int i, j, t;
        for(i = 0; i < n - 1; i++)
        {
            for(j = 0; j < n - 1 - i; j++)
            {
                if(a[j + 1] < a[j])
                { 
                    t = a[j];     
                    a[j] = a[j + 1];
                    a[j + 1] = t;
                }
            }
        }
    }
    
    void pobierz_dane(int tab[], int n)
    {
        int i;
        printf("podaj %d elementow tablicy\n", n);
        for(i = 0; i < n; i++)
        {
             printf("element %d =", i)
             scanf("%d", &tab[i]);
             printf("\n");
        }
    }
    
    void wyswietl_dane(int tab[], int n)
    {
        int i;
        for(i = 0; i < n; i++)
            printf("%d\n", tab[i]);
    }
    
    void przepisz_dane(int tab3[], int tab1[], int n)
    {
        int i;
        for(i = 0; i < n; i++)
            tab3[i] = tab1[i];
    }
    


    ps. swap to nie czarna magia ;-)
  • #11 2478392
    bardzociekawski
    Uczeń
    Posty: 63
    dzięki wisio twoje też działa - tylko jak dałeś:

    for(j = 0; j < n - 1 - i; j++)

    ja bym dał : for(j = 0; j < n - 1; j++) bez " - i " - bo i tak wyjdzie na to samo z -i czy bez -i
  • REKLAMA
  • #12 2481549
    eihs
    Poziom 13  
    Posty: 33
    Pomógł: 6
    bardzociekawski napisał:
    for(j = 0; j < n - 1 - i; j++)

    ja bym dał : for(j = 0; j < n - 1; j++) bez " - i " - bo i tak wyjdzie na to samo z -i czy bez -i


    wynik wyjdzie taki sam, natomiast lepszy jest jednak kod wisia, gdyz wykonuje petle mniej razy. chodzi tutaj o to w petli na sam koniec tabeli wyplywaja [jak babelki :)] najwieksze liczby

    po pierwszym przebiegu:
    xxxxxy
    na samym koncu bedziesz mial najwyzsza liczbe [y], wiec w kolejnym obiegu juz tej wartosci nie musisz w petli obslugiwac, zyskujsz jedno sprawdzenie
    po drugim przebiegu:
    xxxxzy
    bedziesz mial na koncu tabeli dwie najwiekszy liczby [z,y], wiec w tym przypadku zyskujesz juz dwa kolejne sprawdzenia, przy wiekszych tabelach sortowanych babelkowo na pewno takie sortowanie jest odpowiednio szybsze. jego nazwa to bodajze babelkowe z wartownikiem, ale reki za to sobie uciac nie dam :)

    greets
  • #13 2482327
    Samuraj
    Poziom 35  
    Posty: 2792
    Pomógł: 286
    Ocena: 619
    Kod wiso'a jest wydajniejszy. Im więcej elementów to zyskujemy mniej przebiegów w porównaniu z kodem hogan'a.
    Porównywane są kolejne elementy:
    1 z 2
    1 z 3
    1 z 4
    1 z 5
    potem
    2 z 3
    2 z 4
    2 z 5
    3 z 4
    3 z 5
    4 z 5
    Jak widać aby posortowac 5 elementów potrzeba 10 sprawdzeń.

Podsumowanie tematu

✨ Dyskusja dotyczy implementacji sortowania bąbelkowego w języku C bez użycia funkcji swap do zamiany elementów tablicy. Autor programu chce, aby użytkownik wprowadził 5 liczb całkowitych, które następnie zostaną posortowane rosnąco i zapisane w osobnej tablicy "tab3" do dalszego wykorzystania. Wskazano błędy w pierwotnym kodzie, takie jak niepoprawne warunki pętli i porównań oraz niewłaściwe miejsce wywołania funkcji printf, co powodowało nieprawidłowe wyświetlanie wyników. Zaproponowano poprawioną wersję funkcji sortującej, która najpierw kopiuje dane z tablicy wejściowej do "tab3", a następnie wykonuje sortowanie bąbelkowe na "tab3". Omówiono również optymalizację pętli sortowania poprzez zmniejszanie zakresu iteracji o indeks i, co redukuje liczbę porównań i przyspiesza działanie algorytmu. Przykładowy kod zawiera funkcje do pobierania danych, sortowania, wyświetlania oraz kopiowania tablic, co ułatwia modularne wykorzystanie fragmentu w większym programie. Podkreślono, że sortowanie bąbelkowe z optymalizacją jest bardziej efektywne przy większej liczbie elementów.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA