/** * Sortowanie szybkie - QuickSort * @author kodatnik.blogspot.com */ public class SortowanieSzybkie { // metoda zamienia miejscami elementy o indeksach i oraz j // w tablicy przekazanej jako parametr private static void zamien(int[] wejscie, int i, int j) { int temp = wejscie[i]; wejscie[i] = wejscie[j]; wejscie[j] = temp; } // metoda dzieli tablicę (od indeksu p do indeksu k) na dwie części // - elementy mniejsze od wybranego elementu // - elementy większe od wybranego elementu private static int podzial(int[] wejscie, int p, int k) { // wybieramy element wg którego będziemy dzielić // np. element ostatni int element = wejscie[k]; // ustalamy zakres na którym będziemy operować int i = p; int j = k - 1; // pętla wyszukuje kolejne elementy większe i mniejsze od // elementu dzielącego (zmienna element) while(i <= j) { while (wejscie[i] <= element && i < k) i++; while (wejscie[j] > element && j > p) j--; // jeśli elementy są na niewłaściwych pozycjach zamieniamy je if (i < j) zamien(wejscie, i, j); // jeśli indeksy się zrównają kończymy pętlę if (i == j) break; } // na końcu wstawiamy element dzielący na właściwą pozycję zamien(wejscie, i, k); // i zwracamy tę pozycję return i; } // metoda sortuje elementy tablicy przekazanej jako parametr // dodatkowo w jej wywołaniu podajemy indeks pierwszego i ostatniego elementu public static void sortowanieSzybkie(int[] wejscie, int i, int j) { // jeśli indeksy są równe lub niepoprawne zakończ działanie if ( j <= i ) return; // dzielimy tablicę na części, indeks miejsca podziału zapisujemy w zmiennej os (oś) int os = podzial(wejscie, i, j); // rekurencyjnie dokonujemy posortowania lewej i prawej części naszej tablicy sortowanieSzybkie(wejscie, i, os-1); sortowanieSzybkie(wejscie, os+1, j); } // metoda wyświetla zawartość tablicy przekazanej jako parametr na ekranie public static void pokazTablice(int[] wejscie) { // każdy element znajdujący się w tablicy wyświetlamy na ekranie for(int x : wejscie) System.out.print (x + " "); System.out.println (); } public static void main(String[] args) { // tworzymy tablicę wypełniając ją od razu danymi int[] tablica = {4, 6, 1, 2, 3, 8, 7, 9, 5}; // wyświetlamy tablicę na ekranie pokazTablice(tablica); // sortujemy tablicę sortowanieSzybkie(tablica, 0, tablica.length-1); // wyświetlamy posortowaną tablicę na ekranie pokazTablice(tablica); } }
Optymalizacja algorytmu polega na właściwym doborze elementu dzielącego. Najczęściej dokonuje się tego poprzez jego losowy wybór, bądź też wyznaczenie mediany z rozpatrywanych elementów.
Uruchomiona aplikacja:
4 6 1 2 3 8 7 9 5 1 2 3 4 5 6 7 8 9
4 Komentarze - Sortowanie szybkie - QuickSort
Moim zdaniem ten fragment:
29.while(i <= j) {
30.while (wejscie[i] < element) i++;
31.while (wejscie[j] > element && j > p) j--;
powinien chyba wyglądać tak:
29.while(i <= j) {
30.while (wejscie[i] <= element && i < k) i++;
31.while (wejscie[j] > element && j > p) j--;
Powyższy kod nie powinien zadziałać na przykład dla
int [] tablica = {14, 12, 9, 2, 0, 2, 2, 7, 5, 11};
@Anonimowy: Racja, poprawiłem. Dzięki.
Jestem pod wrażeniem. Bardzo ciekawie napisany artykuł.
wiecej wiedzy!
Prześlij komentarz
Możesz użyć niektórych tagów HTML, takich jak <b>, <i>, <u>, <a> Nie spamuj :)