Jak przyspieszyć działanie programu?

0

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);
}
0

nie znam się, nie sugeruj się moim zdaniem

  • może użyj wątków?
  • albo kartę graficzną, GPU wykorzystaj do tego?
1

Ja proponuje napisać ten algorytm poprawnie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1