W tym samouczku dowiesz się, jak działa quicksort. Znajdziesz również działające przykłady szybkiego sortowania w C, C ++ Pythonie i Javie.
Quicksort to algorytm oparty na podejściu dziel i zwyciężaj, w którym tablica jest dzielona na podtablice, a te tablice są rekurencyjnie wywoływane w celu sortowania elementów.
Jak działa QuickSort?
- Z tablicy wybierany jest element przestawny. Możesz wybrać dowolny element z tablicy jako element przestawny.
Tutaj, jako element przestawny, wzięliśmy skrajny prawy (tj. Ostatni element) tablicy.Wybierz element obrotowy
- Elementy mniejsze od elementu obrotowego są umieszczane po lewej stronie, a elementy większe od elementu obrotowego po prawej stronie.
Wszystkie mniejsze elementy należy umieścić po lewej stronie, a większe po prawej stronie elementu obrotowego
. Powyższe ułożenie uzyskuje się wykonując następujące kroki.- Wskaźnik jest zamocowany na elemencie obrotowym. Element pivot jest porównywany z elementami zaczynającymi się od pierwszego indeksu. Jeśli zostanie osiągnięty element większy niż element przestawny, ustawiany jest drugi wskaźnik dla tego elementu.
- Teraz element pivot jest porównywany z innymi elementami (trzeci wskaźnik). Jeśli zostanie osiągnięty element mniejszy niż element obrotowy, mniejszy element jest zamieniany na większy, znaleziony wcześniej.
Porównanie elementu obrotowego z innymi elementami
- Proces trwa aż do osiągnięcia przedostatniego elementu.
Na koniec element pivot jest zamieniany drugim wskaźnikiem.Zamień element obrotowy na drugi wskaźnik
- Teraz lewa i prawa część podrzędna tego elementu obrotowego są brane do dalszego przetwarzania w poniższych krokach.
- Elementy obrotowe są ponownie wybierane oddzielnie dla lewej i prawej części podrzędnej. W tych częściach podrzędnych elementy obrotowe są umieszczone we właściwych miejscach. Następnie powtarza się krok 2.
Wybierz element obrotowy w każdej połowie i umieść go w odpowiednim miejscu za pomocą rekursji
- Podczęści są ponownie podzielone na mniejsze części, aż każda podczęść zostanie utworzona z pojedynczego elementu.
- W tym momencie tablica jest już posortowana.
Quicksort używa rekurencji do sortowania części podrzędnych.
Bazując na podejściu Dziel i rządź, algorytm szybkiego sortowania można wyjaśnić następująco:
- Dzielenie
Tablica jest podzielona na części podrzędne, przyjmując pivot jako punkt podziału. Elementy mniejsze niż czop są umieszczane po lewej stronie osi, a elementy większe niż czop są umieszczane po prawej stronie. - Podbij
Lewa i prawa część podrzędna są ponownie podzielone na partycje za pomocą elementu, wybierając dla nich elementy przestawne. Można to osiągnąć poprzez rekurencyjne przekazywanie części podrzędnych do algorytmu. - Połącz
Ten krok nie odgrywa znaczącej roli w przypadku szybkiego sortowania. Tablica jest już posortowana na końcu kroku zdobywania.
Możesz zrozumieć działanie quicksort za pomocą poniższych ilustracji.


Algorytm szybkiego sortowania
quickSort (array, leftmostIndex, rightmostIndex) if (leftmostIndex <rightmostIndex) pivotIndex <- partition (array, leftmostIndex, rightmostIndex) quickSort (array, leftmostIndex, pivotIndex) quickSort (array, pivotIndex + 1, rightexmostIndex, rightmostIndex) quickSort (array, leftmostIndex, pivotIndex) quickSort (array, pivotIndex + 1, rightexmostIndex, arrayIndex) ) ustaw rightmostIndex jako pivotIndex storeIndex <- leftmostIndex - 1 for i <- leftmostIndex + 1 to rightmostIndex if element (i) <pivotElement swap element (i) i element (storeIndex) storeIndex ++ swap pivotElement and element (storeIndex + 1) + return storeIndex 1
Przykłady w Pythonie, Javie i C / C ++
Python Java C + # Quick sort in Python # Function to partition the array on the basis of pivot element def partition(array, low, high): # Select the pivot element pivot = array(high) i = low - 1 # Put the elements smaller than pivot on the left and greater #than pivot on the right of pivot for j in range(low, high): if array(j) <= pivot: i = i + 1 (array(i), array(j)) = (array(j), array(i)) (array(i + 1), array(high)) = (array(high), array(i + 1)) return i + 1 def quickSort(array, low, high): if low < high: # Select pivot position and put all the elements smaller # than pivot on left and greater than pivot on right pi = partition(array, low, high) # Sort the elements on the left of pivot quickSort(array, low, pi - 1) # Sort the elements on the right of pivot quickSort(array, pi + 1, high) data = (8, 7, 2, 1, 0, 9, 6) size = len(data) quickSort(data, 0, size - 1) print('Sorted Array in Ascending Order:') print(data)
// Quick sort in Java import java.util.Arrays; class QuickSort ( // Function to partition the array on the basis of pivot element int partition(int array(), int low, int high) ( // Select the pivot element int pivot = array(high); int i = (low - 1); // Put the elements smaller than pivot on the left and // greater than pivot on the right of pivot for (int j = low; j < high; j++) ( if (array(j) <= pivot) ( i++; int temp = array(i); array(i) = array(j); array(j) = temp; ) ) int temp = array(i + 1); array(i + 1) = array(high); array(high) = temp; return (i + 1); ) void quickSort(int array(), int low, int high) ( if (low < high) ( // Select pivot position and put all the elements smaller // than pivot on left and greater than pivot on right int pi = partition(array, low, high); // Sort the elements on the left of pivot quickSort(array, low, pi - 1); // Sort the elements on the right of pivot quickSort(array, pi + 1, high); ) ) // Driver code public static void main(String args()) ( int() data = ( 8, 7, 2, 1, 0, 9, 6 ); int size = data.length; QuickSort qs = new QuickSort(); qs.quickSort(data, 0, size - 1); System.out.println("Sorted Array in Ascending Order: "); System.out.println(Arrays.toString(data)); ) )
// Quick sort in C #include // Function to swap position of elements void swap(int *a, int *b) ( int t = *a; *a = *b; *b = t; ) // Function to partition the array on the basis of pivot element int partition(int array(), int low, int high) ( // Select the pivot element int pivot = array(high); int i = (low - 1); // Put the elements smaller than pivot on the left // and greater than pivot on the right of pivot for (int j = low; j < high; j++) ( if (array(j) <= pivot) ( i++; swap(&array(i), &array(j)); ) ) swap(&array(i + 1), &array(high)); return (i + 1); ) void quickSort(int array(), int low, int high) ( if (low < high) ( // Select pivot position and put all the elements smaller // than pivot on left and greater than pivot on right int pi = partition(array, low, high); // Sort the elements on the left of pivot quickSort(array, low, pi - 1); // Sort the elements on the right of pivot quickSort(array, pi + 1, high); ) ) // Function to print eklements of an array void printArray(int array(), int size) ( for (int i = 0; i < size; ++i) ( printf("%d ", array(i)); ) printf(""); ) // Driver code int main() ( int data() = (8, 7, 2, 1, 0, 9, 6); int n = sizeof(data) / sizeof(data(0)); quickSort(data, 0, n - 1); printf("Sorted array in ascending order: "); printArray(data, n); )
// Quick sort in C++ #include using namespace std; // Function to swap position of elements void swap(int *a, int *b) ( int t = *a; *a = *b; *b = t; ) // Function to print eklements of an array void printArray(int array(), int size) ( int i; for (i = 0; i < size; i++) cout << array(i) << " "; cout << endl; ) // Function to partition the array on the basis of pivot element int partition(int array(), int low, int high) ( // Select the pivot element int pivot = array(high); int i = (low - 1); // Put the elements smaller than pivot on the left // and greater than pivot on the right of pivot for (int j = low; j < high; j++) ( if (array(j) <= pivot) ( i++; swap(&array(i), &array(j)); ) ) printArray(array, 7); cout << "… "; swap(&array(i + 1), &array(high)); return (i + 1); ) void quickSort(int array(), int low, int high) ( if (low < high) ( // Select pivot position and put all the elements smaller // than pivot on left and greater than pivot on right int pi = partition(array, low, high); // Sort the elements on the left of pivot quickSort(array, low, pi - 1); // Sort the elements on the right of pivot quickSort(array, pi + 1, high); ) ) // Driver code int main() ( int data() = (8, 7, 6, 1, 0, 9, 2); int n = sizeof(data) / sizeof(data(0)); quickSort(data, 0, n - 1); cout << "Sorted array in ascending order: "; printArray(data, n); )
Złożoność szybkiego sortowania
Złożoność czasowa
-
Złożoność najgorszego przypadku (duże-O) : występuje, gdy wybrany element obrotowy jest albo największym, albo najmniejszym elementem. Ten stan prowadzi do przypadku, w którym element obrotowy znajduje się na skrajnym końcu posortowanej tablicy. Jedna tablica podrzędna jest zawsze pusta, a inna tablica podrzędna zawiera elementy. Zatem quicksort jest wywoływany tylko w tej podtablicy. Jednak algorytm szybkiego sortowania ma lepszą wydajność dla rozproszonych osi.
O(n2)
n - 1
- Złożoność najlepszego przypadku (duża-omega) :
O(n*log n)
Występuje, gdy element obrotu jest zawsze środkowym elementem lub blisko środkowego elementu. - Średnia złożoność przypadku (Big-theta) :
O(n*log n)
Występuje, gdy powyższe warunki nie występują.
Złożoność przestrzeni
Złożoność przestrzeni dla szybkiego sortowania wynosi O(log n)
.
Aplikacje Quicksort
Quicksort jest implementowany, gdy
- język programowania jest dobry do rekurencji
- złożoność czasowa ma znaczenie
- złożoność przestrzeni ma znaczenie