Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyj±tek www.elektroda.pl do Adblock.
Dzięki temu, że ogl±dasz reklamy, wspierasz portal i użytkowników.

sortowanie b±belkowe (:((((((((()

bardzociekawski 31 Mar 2006 12:59 2946 12
  • #1 31 Mar 2006 12:59
    bardzociekawski
    Uczeń

    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]

    0 12
  • #2 31 Mar 2006 13:25
    kordan11
    Poziom 18  

    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ć
    Code:
    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

    0
  • #3 31 Mar 2006 13:27
    bardzociekawski
    Uczeń

    nie, to co napisałe¶ jest Ľle niestety :/

    0
  • #4 31 Mar 2006 13:42
    black80
    Poziom 10  

    A może zamiast

    Cytat:
    if(tab1[i+1]>tab1[i])
    powinno być if(tab1[i+1]<tab1[i]) ??

    0
  • #5 31 Mar 2006 13:51
    bardzociekawski
    Uczeń

    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?

    0
  • #6 31 Mar 2006 14:01
    hogan
    Poziom 11  

    Masz funkcje sortowanie. W tab1 pozostana nieposortowane jak ma byc inaczej to pisz, aha czytaj1 i sortowanie powinny byc typu void.

    Code:
    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]);
            }
    }

    0
  • #7 31 Mar 2006 14:27
    black80
    Poziom 10  

    ż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++)

    0
  • Pomocny post
    #8 31 Mar 2006 14:34
    hogan
    Poziom 11  

    W tym co ja podałem sortuje do piatki i wyswietla tylko koncowke.

    0
  • #9 31 Mar 2006 14:41
    bardzociekawski
    Uczeń

    dzięki hogan działa wy¶mienicie :D

    0
  • Pomocny post
    #10 31 Mar 2006 14:52
    wiso
    Poziom 15  

    nie wiem po co jest tobie tab3 no ale coz, moze to byc np. tak

    Code:
    #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 ;-)

    0
  • #11 31 Mar 2006 15:11
    bardzociekawski
    Uczeń

    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

    0
  • #12 01 Kwi 2006 12:06
    eihs
    Poziom 13  

    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

    0
  • #13 01 Kwi 2006 15:53
    Samuraj
    Poziom 35  

    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ń.

    0