Algorytm sortowania kubełkowego który sam dobiera ilość kubełków
Ostatnio zmodyfikowano 2016-12-02 17:43
Criner Temat założony przez niniejszego użytkownika |
Algorytm sortowania kubełkowego który sam dobiera ilość kubełków » 2016-11-24 21:24:38 Witam forumowiczów, Dążę do zmodyfikowania sortowania kubełkowego tak jak w temacie, jednak to nie jest jedyny cel. Dodatkowo program z wyznaczoną automatycznie ilością kubełków ma działać średnio szybciej niż przy 10 statycznych kubełkach. Do tego celu mam wykorzystać losową próbkę elementów z tablicy. Chciałem sprawdzić przy jakiej ilości kubełków program działa najwydajniej, więc dopisałem pętlę, która liczy czas algorytmu dla ilości kubełków od 1 do 2/n, gdzie n jest długością tablicy, a następnie je sortuje i zapisuje w pliku. No i teraz w zasadzie utknąłem, bo nie wiem jak wykorzystać tę "próbkę". Macie może jakieś pomysły? Poniżej kod: #include <iostream> #include <ctime> #include <cstdlib> #include <fstream>
using namespace std;
struct test { int kubek; double cz_alg; };
struct node { int num; node * next; };
void push( int n, node *& h ) { node * temp = new node; temp->num = n; temp->next = h; h = temp; }
int pop( node *& h ) { int res = h->num; node * temp = h; h = h->next; delete temp; return res; }
void wstawianie( int * tab, int z ) { int tmp; int j; for( int i = 1; i < z; i++ ) { j = i - 1; tmp = tab[ i ]; while( j >= 0 && tab[ j ] > tmp ) { tab[ j + 1 ] = tab[ j ]; j--; } tab[ j + 1 ] = tmp; } }
void wstawianie( test * tabb, int z ) { test tmp; int j; for( int i = 1; i < z; i++ ) { j = i - 1; tmp = tabb[ i ]; while( j >= 0 && tabb[ j ].cz_alg > tmp.cz_alg ) { tabb[ j + 1 ] = tabb[ j ]; j--; } tabb[ j + 1 ] = tmp; } }
void BucketSort( int * tab, int n, int k ) { node * kubelki[ k ]; for( int i = 0; i < k; i++ ) kubelki[ i ] = NULL; for( int i = 0; i < n; i++ ) { push( tab[ i ], kubelki[ int( tab[ i ] /( 2000.0 / k ) ) ] ); } int z = 0; for( int i = 0; i < k; i++ ) { while( kubelki[ i ] ) { tab[ z++ ] = pop( kubelki[ i ] ); } wstawianie( tab, n ); } }
int main() { clock_t s, f; double czas = 0; srand( time( 0 ) ); int n = 4000; int * tab = new int[ n ]; int * tab2 = new int[ n ]; for( int i = 0; i < n; i++ ) tab[ i ] =( rand() % 2000 ); for( int i = 0; i < n; i++ ) tab2[ i ] = tab[ i ]; ofstream plik2; plik2.open( "liczby.txt" ); for( int i = 0; i < n; i++ ) plik2 << tab[ i ] << endl; plik2.close(); int ile = n / 2; test * tab_wyniki = new test[ ile - 1 ]; for( int x = 1; x < ile; x++ ) { s = clock(); BucketSort( tab, n, x ); f = clock(); czas =( double )( f - s ) /( double )( CLOCKS_PER_SEC ); tab_wyniki[ x - 1 ].kubek = x; tab_wyniki[ x - 1 ].cz_alg = czas; for( int i = 0; i < n; i++ ) tab[ i ] = tab2[ i ]; } wstawianie( tab_wyniki, ile - 1 ); ofstream plik; plik.open( "czasy.txt" ); for( int i = 0; i < ile - 1; i++ ) plik << "Kubelki: " << tab_wyniki[ i ].kubek << ", Czas: " << tab_wyniki[ i ].cz_alg << endl; plik.close(); cout << "Koniec zapisu"; delete[] tab_wyniki; delete[] tab; delete[] tab2; return 0; }
|
|
DejaVu |
» 2016-12-02 17:43:11 Za zmienną 'n' podstaw ilość kubełków. Dobieranie dynamiczne nie ma sensu. Jak chcesz coś przyśpieszać to po prostu zmień algorytm. Jeżeli jest to zadanie na uczelnię to wykonaj treść polecenia i olej wydajność. |
|
« 1 » |