Każda implementacja algorytmu musi zliczać tzw operacje dominujące. W przypadku sortowania i wyszukiwania mogą to być operacje porównywania elementów ciągu.
Programy należy pisać w języku C lub w Pascal-u. W poniższych zadaniach powinno się używać następujących "prototypów" i zmiennych:
/* język C */ long int Czas; // zmienna globalna do zliczania operacji dominujących void SortPrzezWstawianie(int *tab, int i1, int i2) { // "i1" i "i2" to zakres elementów tablicy "tab" // który zamierzamy posortowac, tj sortujemy elementy // tab[i1], tab[i1+1], ..., tab[i2-1], tab[i2] } void SortPrzezSelekcje(int *tab, int i1, int i2) {} int CzyJestElementWyszProste(int *tab, int *poz, int elem, int i1, int i2) {}
int CzyJestElementWyszBinarne(int *tab, int *poz, int elem, int i1, int i2) {} void KopiujTablice(int *tab_zrodlo, int *tab_cel, int i1, int i2); { // kopiuje tab_zrodlo do tab_cel // (tylko elementy z zakresu i1,i2) } void LosoweGenerowanieCiaguLiczb(int *tab, int i1, int i2) { // generuje losowo liczby i umieszcza je w tablicy "tab" // (tylko w zakresie i1,i2) } void PokazTablice(int *tab, int i1, int i2) {} int tablica[1000], tablica2[1000]; // te tablice zawierają ciąg liczb; // są potrzebne dwie tablice aby można było // porównać działanie dwóch procedur sortujących // na tych samych danych ! main() { LosoweGenerowanieCiaguLiczb(tablica2,0,19); PokazTablice(tablica2); KopiujTablice(tablica2,tablica,0,19); Czas=0; SortPrzezWstawianie(tablica,0,19); printf("czas działania SortPrzezWstawianie = %li\n", Czas); PokazTablice(tablica); KopiujTablice(tablica2,tablica,0,19); Czas=0; SortPrzezSelekcje(tablica,0,19); printf("czas działania SortPrzezSelekcje = %li\n", Czas); PokazTablice(tablica); }
void SortPrzezWstawianie(int *tab, int i1, int i2) { // sortuje elementy tablicy tab (tylko z zakresu i1,i2) }Ciąg liczb dzielimy na dwie części: posortowaną "S" i nieposortowaną "NS". Bierzemy pierwszy z brzegu element części "NS" i sprawdzamy w które miejsce części "S" powinien być wstawiony. Oczywiście wymaga to przesunięcia elementów "S". Część "S" wydłuża się o jeden element, część "NS" traci jeden elemetnt. Z pewnych względów warto przeszukiwanie części "S" zaczynać od tyłu (dlaczego ?).
"S" || "NS" 1 5 15 95 || 7 3 84 85 86 ^ | | | -------------------- "S" || "NS" 1 5 7 15 95 || 3 84 85 86 ^ | | | ------------------------------ (i tak dalej ...)Zbadaj czas działania (czyli ilość operacji dominujących) dla:
void SortPrzezSelekcje(int *tab, int i1, int i2) { // sortuje elementy tablicy tab (tylko z zakresu i1,i2) }Sortowanie przez selekcję polega na tym, że znajdujemy największy element w ciągu i zamieniamy go z ostatnim elementem, następnie w ciągu bez ostatniego elementu znajdujemy największy element i zamieniamy go z ostatnim, itd.
1 5 15 95 7 3 84 85 86 ^ ^ | | ----------------------------- 1 5 15 86 7 3 84 85 95 1 5 15 86 7 3 84 85 ^ ^ | | ----------------------- 1 5 15 85 7 3 84 86 1 5 15 85 7 3 84 (i tak dalej ...)Zbadaj czas działania tej procedury, podobnie jak w zadaniu 1. Porównaj oba algorytmy, tj zestaw czasy działania obu procedur na tych samych danych.