Witam wszystkich,
Mam problem z moim programem do sortowania liczb (sortowanie przez kopcowanie). O ile sortowanie tablic 1000 elementowych przebiega znośnie, o tyle dla tablic o rozmiarze 10000 w górę staje się to nieznośne (sortowanie 100 tablic 100000-elementowych trwa już ponad 45 minut...). Czy byłby ktoś w stanie wskazać jak w prosty sposób mógłbym "odchudzić" mój program, aby usprawnić proces sortowania?
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int** stworz_tablice (int ilosc_tab, int rozm_tab)
{
int** tablice = new int* [ilosc_tab];
for (int i=0; i<ilosc_tab; i++)
{
tablice[i] = new int [rozm_tab];
}
return tablice;
}
void usun_tablice (int **tablice, int ilosc_tab)
{
for(int i=0; i<ilosc_tab; i++)
delete [] tablice[i];
delete [] tablice;
}
void sprawdz_przodka (int** tablice, int lisc, int ktora_tablica)
{
int przodek;
int tmp;
while(lisc>0)
{
przodek=(lisc+1)/2-1;
if(tablice[ktora_tablica][lisc]>tablice[ktora_tablica][przodek])
{
tmp=tablice[ktora_tablica][przodek];
tablice[ktora_tablica][przodek]=tablice[ktora_tablica][lisc];
tablice[ktora_tablica][lisc]=tmp;
lisc=przodek;
}
else
lisc=0;
}
}
void zamien_z_poczatkiem (int** tablice, int i, int ktora_tablica)
{
int tmp=tablice[ktora_tablica][i];
tablice[ktora_tablica][i]=tablice[ktora_tablica][0];
tablice[ktora_tablica][0]=tmp;
}
void kopcowanie (int** tablice, int rozm_tab, int ktora_tablica)
{
// TWORZENIE KOPCA
for(int lisc=1; lisc<rozm_tab; lisc++) // "int lisc" - pozycja wstawionego liscia (nr kolumny dwuwym. tab. dyn. "tablice")
sprawdz_przodka(tablice, lisc, ktora_tablica);
// ROZBIERANIE KOPCA
for(int rozmiar_kopca=rozm_tab-1; rozmiar_kopca>0; rozmiar_kopca--)
{
zamien_z_poczatkiem (tablice, rozmiar_kopca, ktora_tablica);
for (int lisc=1; lisc<rozmiar_kopca; lisc++)
sprawdz_przodka(tablice, lisc, ktora_tablica);
}
}
int main()
{
int ilosc_tab=100; // liczba wierszy
int rozm_tab=10000; // liczba kolumn
float czas_sortowania;
clock_t start, koniec;
int** tablice = stworz_tablice(ilosc_tab, rozm_tab);
srand(time(NULL)); // generowanie losowych liczb
for(int i=0; i<ilosc_tab; i++)
for(int j=0; j<rozm_tab; j++)
tablice[i][j]=rand()%1000;
start=clock();
for(int i=0; i<ilosc_tab; i++)
{
kopcowanie(tablice, rozm_tab, i);
}
koniec=clock();
czas_sortowania=(float)(koniec-start);
cout << "Czas sortowania wyniosl: " << czas_sortowania/1000.0 << "s" << endl;
usun_tablice(tablice, ilosc_tab);
}