Opis algorytmu
Zasada działania algorytmu sortowania Nieparzyste/Parzyste jest bardzo podobna do algorytmu sortowania bąbelkowego. W tym jednak przypadku staramy się ograniczyć potrzebne kroki do posortowania danych. W celu posortowania danych elementy są porównywane parami i jeśli nie spełniają warunku oczekiwanej zależności to są zamieniane. Zamienianie par odbywa się tyle razy jaką długość ma zadana tablica elementów. Jeśli numer powtórzenia pętli jest nieparzysty to zamieniane są kolejne pary bez pierwszego elementu. W iteracji parzystej pary są wybierane począwszy od pierwszego elementu. Zakładamy, że pierwsza iteracja ma numer 0.
Przykład 1
Jako przykład posortujmy L = {7, 3, 2, 6, 1, 8}. Rozpoczynamy sortowanie od wyboru par bez pierwszego elementu. Zakładamy, że lista ma zostać posortowana rosnąco, więc każda para musi spełniać zależność xi < xi + 1.
Oczywiście każda para może spełniać także warunek xi > xi + 1, aby dane były posortowane malejąco. Wszystko zależy jedynie od potrzeb oraz implementacji.
Przykład 1
Weźmy tym razem przykładowo listę L = {10, 6, 2, 3, 8, 1, 5, 7, 4, 9}. Ponownie tablica ma zostać posortowana rosnąco xi < xi + 1.
Implementacja
Zakładamy, że program ma do posortowania tablice liczb całkowitych tak, aby tablica była posortowana rosnąco. Zadanie można wykonać przy pomocy pętli for. W każdej iteracji rozpoznajemy jak mamy wybierać pary, a następnie to przeprowadzamy.
- static void sortuj(int[] tab) {
- for (int i = 0; i < tab.Length; i++) {
- if (i % 2 == 0) {
- for (int j = 1; j < tab.Length; j += 2) {
- if (tab[j] < tab[j - 1]) {
- int tmp = tab[j - 1];
- tab[j - 1] = tab[j];
- tab[j] = tmp;
- }
- }
- } else {
- for (int j = 2; j < tab.Length; j += 2) {
- if (tab[j] < tab[j - 1]) {
- int tmp = tab[j - 1];
- tab[j - 1] = tab[j];
- tab[j] = tmp;
- }
- }
- }
- }
- }
(2.) Wykonujemy n iteracji. Za każdym razem (3.) sprawdzamy parzystość wykonywanej iteracji. Nastepnie (4. - 7.) sortujemy dane wybierając wszystkie pary po kolei, albo (9. - 12.) kolejne pary bez uwzględniania elementu pierwszego i ostatniego.
Testowanie funkcji
Poniższy fragment kodu wczytuje od użytkownika długość tablicy oraz jej elementy. Następnie sortuje dane i wypisuje posortowaną tablicę na ekran.
- static void Main(string[] args) {
- Console.Write("Podaj ile jest elementow\n n = ");
- int n = Convert.ToInt32(Console.ReadLine());
- int[] tab = new int[n];
- Console.WriteLine("Podaj elementy:\n");
- for (int i = 0; i < n; i++)
- tab[i] = Convert.ToInt32(Console.ReadLine());
- sortuj(tab);
- Console.WriteLine("Po posortowaniu:");
- for (int i = 0; i < n; i++)
- Console.Write("{0} ", tab[i]);
- Console.ReadKey();
- }
Zadania
Zadanie 1
Przepisz funkcję sortuj() tak, aby korzystała z rekurencji. Postaraj się tak napisać program, aby wewnątrz funkcji sortuj() występowała tylko jedna pętla z jednym warunkiem w środku. Przetestuj działanie funkcji.