====== Sortowanie 1 ======
**Termin zajęć:** 15/16.03.2011
**Do przygotowania:**
- Teoria:
- Sortowanie stabilne i niestabilne.
- Zasada działania algorytmów sortowania:
- bąbelkowego (BubbleSort),
- przez wybór (SelectionSort),
- przez wstawianie (InsertionSort),
- przez zliczanie (CountingSort).
- Ograniczenia stosowania w.w. algorytmów.
- Implementacja funkcji sortujących dla wszystkich w.w. algorytmów:
- Sortowanie bąbelkowe:void sortBubble(type* tab, int length)
- Sortowanie przez wybór:void sortSelection(type* tab, int length)
- Sortowanie przez wstawianie:void sortInsertion(type* tab, int length)
- Sortowanie przez zliczanie:void sortCounting(type* tab, int length)
- W przypadku implementacji algorytmu sortowania przez zliczanie należy wcześniej obliczyć wielkość przedziału wartości w tablicy którą należy posortować. \\ Następnie, na podstawie tego wyniku należy określić wielkość tablicy zliczającej.
- Proszę przygotować prostą funkcję, która będzie używana do porównywania wartości.
/*
* \brief Funkcja porównująca dwie wartości
*
* \param val1 - wartość 1.
* \param val2 - wartość 2.
* \return Funkcja zwraca:
* \li -1 jeżeli val1 > val2
* \li 0 jeżeli val1 == val2
* \li 1 jeżeli val1 < val2
*/
int compare(type val1, type val2)
- Powyższa funkcja powinna być użyta do **wszystkich** operacji porównywania wartości jaki są wykonywane podczas działania wyżej wymienionych algorytmów.
- Proszę przygotować prostą funkcję, która będzie używana do wypisywania tablicy:
/*
* \brief Funkcja wypisująca wartości tablicy
*
* \param tab - tablica wartosci
* \param length - wielkość tablicy
*/
void printtab(type* tab, int length)
- **type** jest zdefiniowane poprzez **typedef**:typedef int type;
umożliwi nam to szybką zmianę typu na którym będziemy pracowali.
- Do pomiaru czasu działania algorytmów (na tych oraz późniejszych zajęciach) będziemy używali funkcji **rdtsc**:
#include
__inline__ uint64_t rdtsc()
{
uint32_t lo, hi;
__asm__ __volatile__ (
"xorl %%eax,%%eax \n cpuid"
::: "%rax", "%rbx", "%rcx", "%rdx");
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return (uint64_t)hi << 32 | lo;
}
- Funkcja zwraca liczbę cykli procesora od momentu uruchomienia komputera. Do pomiaru czasu działania kodu wykorzystujemy ją następująco:
uint64_t s,e,d;
...
s = rdtsc();
// kod którego czas wykonania mierzymy
e = rdtsc();
d = e-s;
printf("Czas wykonania kodu d = %lld\n", d);
- Bardzo proszę przetestować na swoich systemach operacyjnych czy funkcja **rdtsc** nie jest zablokowana.