QuickSort je algoritem za razvrščanje, ki temelji na Algoritem deli in vladaj ki izbere element kot vrtišče in razdeli dano matriko okoli izbranega vrtišča tako, da vrtišče postavi na pravilno mesto v razvrščeni matriki.
Kako deluje QuickSort?
Priporočena praksa Hitro razvrščanje Poskusite!Ključni proces v hitro razvrščanje je particija () . Cilj particij je postaviti vrtišče (kateri koli element je lahko izbran za vrtišče) na pravilno mesto v razvrščeni matriki in vse manjše elemente postaviti levo od vrtišča, vse večje elemente pa desno od vrtišča. .
Razdelitev se izvede rekurzivno na vsaki strani vrtišča, potem ko je vrtišče postavljeno v pravilen položaj in to končno razvrsti niz.
Kako deluje Quicksort
primerjava nizov v Javi
Izbira vrtišča:
Obstaja veliko različnih možnosti za izbiranje pivotov.
- Za vrtišče vedno izberite prvi element .
- Za vrtišče vedno izberi zadnji element (implementirano spodaj)
- Izberite naključni element kot vrtišče .
- Izberite sredino kot vrtišče.
Algoritem za razdelitev:
Logika je preprosta, začnemo od skrajno levega elementa in sledimo indeksu manjših (ali enakih) elementov kot jaz . Če med prečkanjem najdemo manjši element, trenutni element zamenjamo z arr[i]. V nasprotnem primeru ignoriramo trenutni element.
Razumejmo delovanje particije in algoritma za hitro razvrščanje s pomočjo naslednjega primera:
Razmislite o: arr[] = {10, 80, 30, 90, 40}.
- Primerjajte 10 z vrtiščem in, ker je manjši od vrtišča, ga uredite ustrezno.
Particija v QuickSort: primerjajte vrtišče z 10
- Primerjajte 80 z vrtiščem. Je večji od vrtišča.
Particija v QuickSort: primerjajte pivot z 80
spletni gonilnik
- Primerjaj 30 z vrtiščem. Je manjši od vrtišča, zato ga ustrezno uredite.
Particija v QuickSort: primerjajte pivot s 30
- Primerjajte 90 z vrtiščem. Večji je od vrtišča.
Particija v QuickSort: primerjajte pivot z 90
- Postavite vrtišče v pravilen položaj.
Particija v QuickSort: postavite vrtišče na pravilen položaj
Ilustracija Quicksort:
Ker se postopek particije izvaja rekurzivno, še naprej postavlja vrtišče na njegov dejanski položaj v razvrščeni matriki. Ponavljajoče se vrtišča v njihov dejanski položaj naredijo matriko razvrščeno.
Sledite spodnjim slikam, da boste razumeli, kako rekurzivna izvedba particijskega algoritma pomaga razvrstiti matriko.
pete davidson državljanstvo
- Začetna particija na glavnem polju:
Quicksort: Izvedba particije
- Razdelitev podnizkov:
Quicksort: Izvedba particije
Implementacija kode hitrega razvrščanja:
C++ #include using namespace std; int partition(int arr[],int low,int high) { //choose the pivot int pivot=arr[high]; //Index of smaller element and Indicate //the right position of pivot found so far int i=(low-1); for(int j=low;j<=high-1;j++) { //If current element is smaller than the pivot if(arr[j] C // C program for QuickSort #include // Utility function to swap tp integers void swap(int* p1, int* p2) { int temp; temp = *p1; *p1 = *p2; *p2 = temp; } int partition(int arr[], int low, int high) { // choose the pivot int pivot = arr[high]; // Index of smaller element and Indicate // the right position of pivot found so far int i = (low - 1); for (int j = low; j <= high - 1; j++) { // If current element is smaller than the pivot if (arr[j] < pivot) { // Increment index of smaller element i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[high]); return (i + 1); } // The Quicksort function Implement void quickSort(int arr[], int low, int high) { // when low is less than high if (low < high) { // pi is the partition return index of pivot int pi = partition(arr, low, high); // Recursion Call // smaller element than pivot goes left and // higher element goes right quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } int main() { int arr[] = { 10, 7, 8, 9, 1, 5 }; int n = sizeof(arr) / sizeof(arr[0]); // Function call quickSort(arr, 0, n - 1); // Print the sorted array printf('Sorted Array
'); for (int i = 0; i < n; i++) { printf('%d ', arr[i]); } return 0; } // This Code is Contributed By Diwakar Jha> Java // Java implementation of QuickSort import java.io.*; class GFG { // A utility function to swap two elements static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } // This function takes last element as pivot, // places the pivot element at its correct position // in sorted array, and places all smaller to left // of pivot and all greater elements to right of pivot static int partition(int[] arr, int low, int high) { // Choosing the pivot int pivot = arr[high]; // Index of smaller element and indicates // the right position of pivot found so far int i = (low - 1); for (int j = low; j <= high - 1; j++) { // If current element is smaller than the pivot if (arr[j] < pivot) { // Increment index of smaller element i++; swap(arr, i, j); } } swap(arr, i + 1, high); return (i + 1); } // The main function that implements QuickSort // arr[] -->Matrika za razvrščanje, // nizko --> začetni indeks, // visoko --> končni indeks static void quickSort(int[] arr, int low, int high) { if (low< high) { // pi is partitioning index, arr[p] // is now at right place int pi = partition(arr, low, high); // Separately sort elements before // partition and after partition quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // To print sorted array public static void printArr(int[] arr) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + ' '); } } // Driver Code public static void main(String[] args) { int[] arr = { 10, 7, 8, 9, 1, 5 }; int N = arr.length; // Function call quickSort(arr, 0, N - 1); System.out.println('Sorted array:'); printArr(arr); } } // This code is contributed by Ayush Choudhary // Improved by Ajay Virmoti> Python # Python3 implementation of QuickSort # Function to find the partition position def partition(array, low, high): # Choose the rightmost element as pivot pivot = array[high] # Pointer for greater element i = low - 1 # Traverse through all elements # compare each element with pivot for j in range(low, high): if array[j] <= pivot: # If element smaller than pivot is found # swap it with the greater element pointed by i i = i + 1 # Swapping element at i with element at j (array[i], array[j]) = (array[j], array[i]) # Swap the pivot element with # the greater element specified by i (array[i + 1], array[high]) = (array[high], array[i + 1]) # Return the position from where partition is done return i + 1 # Function to perform quicksort def quicksort(array, low, high): if low < high: # Find pivot element such that # element smaller than pivot are on the left # element greater than pivot are on the right pi = partition(array, low, high) # Recursive call on the left of pivot quicksort(array, low, pi - 1) # Recursive call on the right of pivot quicksort(array, pi + 1, high) # Driver code if __name__ == '__main__': array = [10, 7, 8, 9, 1, 5] N = len(array) # Function call quicksort(array, 0, N - 1) print('Sorted array:') for x in array: print(x, end=' ') # This code is contributed by Adnan Aliakbar> C# // C# implementation of QuickSort using System; class GFG { // A utility function to swap two elements static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } // This function takes last element as pivot, // places the pivot element at its correct position // in sorted array, and places all smaller to left // of pivot and all greater elements to right of pivot static int partition(int[] arr, int low, int high) { // Choosing the pivot int pivot = arr[high]; // Index of smaller element and indicates // the right position of pivot found so far int i = (low - 1); for (int j = low; j <= high - 1; j++) { // If current element is smaller than the pivot if (arr[j] < pivot) { // Increment index of smaller element i++; swap(arr, i, j); } } swap(arr, i + 1, high); return (i + 1); } // The main function that implements QuickSort // arr[] -->Matrika za razvrščanje, // nizko --> začetni indeks, // visoko --> končni indeks static void quickSort(int[] arr, int low, int high) { if (low< high) { // pi is partitioning index, arr[p] // is now at right place int pi = partition(arr, low, high); // Separately sort elements before // and after partition index quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // Driver Code public static void Main() { int[] arr = { 10, 7, 8, 9, 1, 5 }; int N = arr.Length; // Function call quickSort(arr, 0, N - 1); Console.WriteLine('Sorted array:'); for (int i = 0; i < N; i++) Console.Write(arr[i] + ' '); } } // This code is contributed by gfgking> JavaScript // Function to partition the array and return the partition index function partition(arr, low, high) { // Choosing the pivot let pivot = arr[high]; // Index of smaller element and indicates the right position of pivot found so far let i = low - 1; for (let j = low; j <= high - 1; j++) { // If current element is smaller than the pivot if (arr[j] < pivot) { // Increment index of smaller element i++; [arr[i], arr[j]] = [arr[j], arr[i]]; // Swap elements } } [arr[i + 1], arr[high]] = [arr[high], arr[i + 1]]; // Swap pivot to its correct position return i + 1; // Return the partition index } // The main function that implements QuickSort function quickSort(arr, low, high) { if (low < high) { // pi is the partitioning index, arr[pi] is now at the right place let pi = partition(arr, low, high); // Separately sort elements before partition and after partition quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } // Driver code let arr = [10, 7, 8, 9, 1, 5]; let N = arr.length; // Function call quickSort(arr, 0, N - 1); console.log('Sorted array:'); console.log(arr.join(' '));> PHP // code ?>// Ta funkcija postavi zadnji element kot vrtišče // Postavi vrtišče na pravilen položaj // v razvrščeni matriki in vse manjše postavi levo // od vrtišča in vse večje elemente desno od particije vrtilne funkcije (&$arr, $low,$high) { // Izberite vrtilni element $pivot= $arr[$high]; // Indeks manjšega elementa in označuje // desni položaj vrtišča $i=($low-1); za ($j=$low;$j<=$high-1;$j++) { if($arr[$j]<$pivot) { // Increment index of smaller element $i++; list($arr[$i],$arr[$j])=array($arr[$j],$arr[$i]); } } // Pivot element as correct position list($arr[$i+1],$arr[$high])=array($arr[$high],$arr[$i+1]); return ($i+1); } // The main function that implement as QuickSort // arr[]:- Array to be sorted // low:- Starting Index //high:- Ending Index function quickSort(&$arr,$low,$high) { if($low<$high) { // pi is partition $pi= partition($arr,$low,$high); // Sort the array // Before the partition of Element quickSort($arr,$low,$pi-1); // After the partition Element quickSort($arr,$pi+1,$high); } } // Driver Code $arr= array(10,7,8,9,1,5); $N=count($arr); // Function Call quickSort($arr,0,$N-1); echo 'Sorted Array:
'; for($i=0;$i<$N;$i++) { echo $arr[$i]. ' '; } //This code is contributed by Diwakar Jha> Izhod
Sorted Array 1 5 7 8 9 10>
Analiza kompleksnosti hitrega razvrščanja :
Časovna zapletenost:
- Najboljši primer : Ω (N log (N))
Najboljši primer za hitro razvrščanje se zgodi, ko vrtišče, izbrano v vsakem koraku, razdeli matriko na približno enake polovice.
V tem primeru bo algoritem naredil uravnotežene particije, kar vodi do učinkovitega razvrščanja. - Povprečni primer: θ (N log (N))
Učinkovitost QuickSorta v povprečnih primerih je v praksi običajno zelo dobra, zaradi česar je eden najhitrejših algoritmov za razvrščanje. - Najslabši primer: O(N2)
Najslabši možni scenarij za hitro razvrščanje se pojavi, ko vrtenje pri vsakem koraku dosledno povzroči zelo neuravnotežene particije. Ko je matrika že razvrščena in je vrtišče vedno izbrano kot najmanjši ali največji element. Za ublažitev najslabšega možnega scenarija se uporabljajo različne tehnike, kot je izbira dobrega vrtišča (npr. mediana tri) in uporaba naključnega algoritma (naključno hitro razvrščanje) za premeščanje elementa pred razvrščanjem. - Pomožni prostor: O(1), če ne upoštevamo rekurzivnega skladovnega prostora. Če upoštevamo prostor rekurzivnega sklada, bi lahko v najslabšem primeru prišlo do hitrega razvrščanja O ( n ).
Prednosti hitrega razvrščanja:
- Je algoritem deli in vladaj, ki olajša reševanje problemov.
- Učinkovit je pri velikih nizih podatkov.
- Ima nizke stroške, saj za delovanje potrebuje le majhno količino pomnilnika.
Slabosti hitrega razvrščanja:
- V najslabšem primeru ima časovno kompleksnost O(N2), ki se pojavi, ko je pivot izbran slabo.
- To ni dobra izbira za majhne nize podatkov.
- To ni stabilno razvrščanje, kar pomeni, da če imata dva elementa isti ključ, njun relativni vrstni red ne bo ohranjen v razvrščenem izhodu v primeru hitrega razvrščanja, ker tukaj zamenjujemo elemente glede na položaj vrtišča (brez upoštevanja njihovega izvirnika položaji).
