| Janusz11 Temat założony przez niniejszego użytkownika | Porównanie metod sortowania liniowego » 2016-12-16 16:24:23 Witam. Dlaczego gdy odpalam program w takiej formie czas przy sortowaniu przez wstawianie wynosi 0, a kiedy wykomentuję inne sortowania w funkcji main to normalnie wyświetla około 80 cykli? Głowię się już nad tym pewien czas i się poddaję. Z góry dzięki za pomoc :) #include <iostream>#include <cstdlib>
 #include <ctime>
 
 using namespace std;
 
 int n = 10000;
 
 void losuj( int t[], int n )
 {
 for( int i = 0; i < n; i++ )
 t[ i ] = rand() % 9999;
 
 }
 
 void wypisz( int t[], int n )
 {
 for( int i = 0; i < n; i++ )
 cout << t[ i ] << " ";
 
 }
 
 void babelkowe( int t[], int n )
 {
 for( int j = 0; j < n - 1; j++ )
 for( int i = 0; i < n - 1; i++ )
 {
 if( t[ i ] > t[ i + 1 ] )
 {
 int tmp = t[ i ];
 t[ i ] = t[ i + 1 ];
 t[ i + 1 ] = tmp;
 }
 }
 }
 
 void babelkowe_ulepszone( int t[], int n )
 {
 for( int j = 0; j < n - 1; j++ )
 for( int i = 0; i < n - 1 - j; i++ )
 {
 if( t[ i ] > t[ i + 1 ] )
 {
 int tmp = t[ i ];
 t[ i ] = t[ i + 1 ];
 t[ i + 1 ] = tmp;
 }
 }
 }
 
 void wybieranie( int t[], int n )
 {
 int tmp, k;
 for( int i = 0; i < n; i++ )
 {
 k = i;
 for( int j = i + 1; j < n; j++ )
 if( t[ j ] < t[ k ] )
 k = j;
 
 tmp = t[ k ];
 t[ k ] = t[ i ];
 t[ i ] = tmp;
 }
 }
 
 void wstawianie( int t[], int n )
 {
 int i, k, elem;
 for( i = 1; i < n; i++ )
 {
 elem = t[ i ];
 k = i - 1;
 while( k >= 0 && t[ k ] > elem )
 {
 t[ k + 1 ] = t[ k ];
 --k;
 }
 t[ k + 1 ] = elem;
 }
 }
 
 void zliczanie( int t[], int n )
 {
 int m = 0, i;
 for( i = 0; i < n; i++ )
 if( m < t[ i ] )
 m = t[ i ];
 
 int P[ m + 1 ] = { 0 };
 for( int i = 0; i < n; i++ )
 P[ t[ i ] ] ++;
 
 int k = 0;
 for( int i = 0; i <= m; i++ )
 for( int j = P[ i ]; j >= 1; j-- )
 {
 t[ k ] = i;
 k++;
 }
 }
 
 
 int main()
 {
 srand( time( NULL ) );
 double start, stop, czas;
 int t[ 10000 ], T[ 10000 ];
 losuj( t, n );
 
 cout << "Sortowanie babelkowe:" << endl;
 for( int i = 0; i < n; i++ )
 T[ i ] = t[ i ];
 
 start = clock();
 babelkowe( t, n );
 stop = clock();
 czas =( stop - start );
 cout << czas << endl;
 
 cout << "Sortowanie babelkowe ulepszone:" << endl;
 for( int i = 0; i < n; i++ )
 T[ i ] = t[ i ];
 
 start = clock();
 babelkowe_ulepszone( t, n );
 stop = clock();
 czas =( stop - start );
 cout << czas << endl;
 
 cout << "Sortowanie przez wybieranie:" << endl;
 for( int i = 0; i < n; i++ )
 T[ i ] = t[ i ];
 
 start = clock();
 wybieranie( t, n );
 stop = clock();
 czas =( stop - start );
 cout << czas << endl;
 
 cout << "Sortowanie przez wstawianie:" << endl;
 for( int i = 0; i < n; i++ )
 T[ i ] = t[ i ];
 
 start = clock();
 wstawianie( t, n );
 stop = clock();
 czas =( stop - start );
 cout << czas << endl;
 
 cout << "Sortowanie przez zliczanie:" << endl;
 for( int i = 0; i < n; i++ )
 T[ i ] = t[ i ];
 
 start = clock();
 zliczanie( t, n );
 stop = clock();
 czas =( stop - start );
 cout << czas << endl;
 
 return 0;
 }
 
 | 
|  | 
| czaffik | » 2016-12-16 16:57:35 Ponieważ tablica została już posortowana, jak zakomentujesz inne wywołania sortowań do funkcji sortującej przez wstawianie trafia nieposortowana tablica i czas jej wykonania się wydłuża. Pewno myślałeś że funkcja sortująca nie zmodyfikuje tablicy z funkcji głównej?U mnie np wyszło że czas sortowania tym algorytmem nieposortowanej tablicy wynosi ok 140 a posortowanej 0.
 Dla porównania czas sortowania metodą bąbelkową nieposortowanej tablicy to 700, natomiast posortowanej spada do 400.
 Po co ci tablica T i przepisywanie do niej wartości z tablicy t?
 | 
|  | 
| mateczek | » 2016-12-16 17:07:47 Po prostu do funkcji powinien wysłać "T" a nie "t" | 
|  | 
| Janusz11 Temat założony przez niniejszego użytkownika | » 2016-12-16 17:09:30 Tablica "t" jest to pierwotna tablica, w której zostały wylosowane liczby. Przed każdym wywołaniem funkcji sortującej przepisuje liczby z tablicy "t" do "T", aby liczby były nieposortowane. W wyżej przywołanych tablicach ta metoda się sprawdza, a na sortowaniu przez wstawianie przestaje spełniać swoją funkcję. | 
|  | 
| Janusz11 Temat założony przez niniejszego użytkownika | » 2016-12-16 17:11:19 W którym miejscu mam to zmienić? | 
|  | 
| czaffik | » 2016-12-16 17:18:52 Po prostu powinieneś wysyłać do funkcji sortujących T a nie t, czyli zamiast np: zrobić to: i tak dla każdego wywołania funkcji sortującej. | 
|  | 
| mateczek | » 2016-12-16 17:22:12 | W którym miejscu mam to zmienić? | 
 zbijasz się ?? po odpowiedzi "Czaffika" myślałem, że zwyczajnie literówka w kodzie i posyłasz nie te tablicę do sortowania przez pomyłkę :P  | 
|  | 
| Janusz11 Temat założony przez niniejszego użytkownika | » 2016-12-16 18:04:24 Dobra, czaję :PNie zauważyłem tak prostego błędu. Dzięki :>
 | 
|  | 
| « 1 » |