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.

[C] Algorytm sortowania bąbelkowego z użyciem wskaźników

Raulpg 09 Lis 2010 21:10 3573 3
  • #1 09 Lis 2010 21:10
    Raulpg
    Poziom 12  

    Otóż mam taki problem. Sortowanie musi być napisane za pomocą wskaźników. Napisałem taki oto program, nie chce sortować tylko wyświetla elementy wprowadzone z klawiatury. Gdzie są błędy?

    Code:

    #include <cstdlib>
    #include <stdio.h>
    main()
    {
    int k, i, j, n = 4, *pt, temp, zamien=0;
        pt = (int *) malloc (n*sizeof(int));
        for (i=0;i<n;i++)
            {
                k=scanf("%d",pt++);
                fflush(stdin);
            }   while (k==0);
    printf("\t\t SORTOWANIE ROSNACE ");
    printf("\n\n");
    do
      {
       for (j=n;j>0;j--)
           {
           if (*pt < *(pt-1))
                {
                temp=*pt;
                *pt=*(pt-1);
                *(pt-1)=temp;
                zamien++;
                printf(" [%d] %d",*pt,zamien); // tutaj sprawdzam co robi
                }
           }
       } while (zamien!=0); 
    pt=pt-n;
    printf(" Wprowadzone liczby to: ");
    for (i=0;i<n;i++)
        {
        printf(" [%d]",*pt); // W tym miejscu wyswietla ostateczny wynik
        pt++;
        }
    printf(" Liczba zamian = %d",zamien); 
    free(pt);       
    printf("\n\n");
    system("Pause");
    return 0;
    }

    0 3
  • #2 09 Lis 2010 23:56
    Matejkos
    Poziom 20  

    Kolego nie mam za dużo czasu na sprawdzenie ale z tego co widzę to sortujesz tylko pierwsze 2 elementy w tej tablicy w kolejnych przebiegach fora powinieneś modyfikować wskaźnik także poprzez j. Nie pamiętam dokładnie algorytmu ale to jest chyba jeden z błędów. Jutro może uda mi się coś więcej powiedzieć

    Pozdrawiam Matejkos

    0
  • #3 10 Lis 2010 09:38
    redie
    Poziom 15  

    Ot takiż kod powinien sprostać twego wymagania. Zamiast twej pętli while i for zastosuj poniższe wypociny:

    Code:
    for ( i = 0; i < n-1; i++ )
    
    for ( j = 0; i < n-1-i; j++ )
    {
       if ( *(pt+j*4) > *(pt+j*4+4) )
       {
          temp = *(pt+j*4);
          *(pt+j*4) = *(pt+j*4+4);
          *(pt+j*4+4) = temp;
       }
    }

    Pamiętaj iż int nie jest 1-bajtowy lecz 4 bajtowy, więc należy dodać/odjąć wartość 4 do wskaźnika by przeskoczyć do następnego/poprzedniego elementu.

    edit:
    Lepiej jest użyć sizeof(int) niż liczby 4.

    0
  • #4 11 Lis 2010 00:20
    Raulpg
    Poziom 12  

    Kolego redie, nie wiem czy sprawdzałeś to, co zamieściłeś. W każdym razie ja sprawdziłem i niczego nowego twoja poprawka nie wnosi, nadal wyświetla to co wcześniej.

    Trochę to trwało, ale poradziłem sobie. Program sortuje bąbelkowo. Sugestia z druga pętlą for okazała się być trafna. Dzięki.

    1