Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ sortowanie przez kopcowanie. Bardzo proszę o pomoc.

Ostatnio zmodyfikowano 2011-11-29 00:16
Autor Wiadomość
gts_krk
Temat założony przez niniejszego użytkownika
C++ sortowanie przez kopcowanie. Bardzo proszę o pomoc.
» 2011-11-28 22:44:18
Witam.

 Prosze o pomoc przy sortowaniu przez kopcowanie. Mam już program, który sortuje losową tablicę metodą kopcowania ale nie wiem jak zrobic drugą częsc zadania.

 Użytkownik wprowadza jaką cześc tablicy posortowac. Nie mam pojęcia jak to zrobic. Dopiero zaczynam programowanie więc nie mam wprawy w tym.

 Funkcja ma wyglądac tak :

C/C++
void kopowanie( int * tablica, lewa, prawa )
{...}
lewa,prawa- krawędzie tablicy, które wybraliśmy do sortowania

KOD:
C/C++
#include <cstdlib>
#include <iostream>
#include <ctime>

using namespace std;

void sortowanie_kopcowe( int * tablica, int rozmiar )
{
    int i, j;
    for( int m = 2; m <= rozmiar; m++ )
    {
        i = m;
        j = i / 2;
        while(( tablica[ i ] > tablica[ j ] ) &&( j > 0 ) )
        {
            swap( tablica[ i ], tablica[ j ] );
            i = j;
            j = i / 2;
        }
    }
    //kolejna cześć programu która będzie sortowała tablicę
    int p;
    for( int m = rozmiar; m > 1; m-- )
    {
        swap( tablica[ 1 ], tablica[ m ] ); // m-przechowuje koniec aktualnego kopca
        i = 1;
        j = 2;
       
        while( j < m )
        {
            if(( j + 1 < m ) &&( tablica[ j ] < tablica[ j + 1 ] ) )
                 p = j + 1;
            else
                 p = j;
           
            if( tablica[ p ] <= tablica[ i ] )
                 break;
           
            swap( tablica[ p ], tablica[ i ] );
            i = p;
            j = i + i;
        }
    }
}


int main( int argc, char * argv[] )
{
    int k = rand();
    int n;
    int * tab;
    srand( time( 0 ) );
    cout << "Podaj rozmiar tablicy: " << endl;
    cin >> n;
    tab = new int[ n ];
    for( int i = 0; i < n; i++ )
    {
        tab[ i ] = rand() %( 101 );
        cout << " " << tab[ i ];
    }
    sortowanie_kopcowe( tab, n - 1 );
    cout << endl;
    for( int i = 0; i < n; i++ )
    {
        cout << " " << tab[ i ];
    }
   
   
   
    system( "PAUSE" );
    return EXIT_SUCCESS;
}

Bardzo proszę o pomoc.
P-44916
DejaVu
» 2011-11-28 22:47:08
Wystarczy poprawić tą linijkę:
C/C++
sortowanie_kopcowe( tab, n - 1 );
Przykład:
C/C++
sortowanie_kopcowe( tab + 10, n - 1 - 20 );
Nie posortuje pierwszych 10 i ostatnich 10 liczb.
P-44918
gts_krk
Temat założony przez niniejszego użytkownika
» 2011-11-28 22:51:11
Dziękuję za odpowiedz.

Ale jak pózniej w programie zrobic żeby brał pod uwagę lewą i prawą krawędz tablicy a nie rozmiar.

Wiem, że moje pytanie jest głupie ale dopiero zaczynam uczyc się programowania.
P-44919
DejaVu
» 2011-11-28 22:55:21
Sortujesz najpierw lewą krawędź tablicy, a potem prawą... wszystko sprowadza się do tej jednej linijki. Czy Ty aby na pewno rozumiesz co napisałeś...? :) Bo ja w to wątpię :)
P-44921
gts_krk
Temat założony przez niniejszego użytkownika
» 2011-11-28 23:00:17
Rozumiem, że chodzi o jedną linię. Chodz mi o to, że funkcja miała wyglądac tak:

void kopcowanie( int * tablica, lewa, prawa )

Czy da się poprawic program żeby do funkcji przekazywac całą tablicę. Nie wiem dlaczego ale prowadzący zajęcia zwrócił na to uwagę. Takie było polecenie mojego zadania.


Jeszcze mam pytanie odnośnie kodu. Nie wiem dlaczego nie sortuje mi pierwszego elementu.


sortowanie szybkie pisaliśmy tak:
C/C++
void sortowanie_szybkie( int * tablica, int lewa, int prawa )
{
    int x = tablica[( lewa + prawa ) / 2 ];
    int i = lewa, j = prawa;
    do {
        while( tablica[ i ] < x ) i++;
       
        while( tablica[ j ] > x ) j--;
       
        if( i <= j )
        {
            swap( tablica[ i ], tablica[ j ] );
            i++, j--;
        } }
    while( i <= j );
   
    if( lewa < j )
         sortowanie_szybkie( tablica, lewa, j );
   
    if( prawa > i )
         sortowanie_szybkie( tablica, i, prawa );
   
}
P-44922
DejaVu
» 2011-11-28 23:52:31
Z Twoich kilku postów ewidentnie wynika, że Twoim celem jest zaliczyć, a nie zrozumieć. Nie rozumiesz nawet części kodu, który wkleiłeś, a co więcej - nie starasz się go nawet zrozumieć. My tu mamy niepisaną zasadę - dać wędkę, a nie rybę. Ty nie chcesz wędki lecz rybę, więc dla mnie temat jest zakończony. Problem, który masz jest banalny do rozwiązania znając podstawy. Algorytmów z kolei nie omawia się zanim uczeń nie pozna podstaw programowania. Po co poszedłeś na kierunek związany z informatyką skoro nie chcesz się nauczyć programowania...?
P-44928
gts_krk
Temat założony przez niniejszego użytkownika
» 2011-11-28 23:56:46
Nie prosiłem o napisanie gotowego kodu. Chodzi mi o wskazówki odnośnie tego zadania.

Na większości kierunków technicznych jest programowanie. Kierunek nie musi byc związany mocno z informatyką.

Mimo wszystko, dzięki za pomoc.
P-44929
DejaVu
» 2011-11-29 00:02:06
Po pierwsze dostałeś wskazówki.
Po drugie sam wkleiłeś wskazówki.
P-44930
« 1 » 2
  Strona 1 z 2 Następna strona