Selecció ràpida és un algorisme de selecció per trobar el k-èsim element més petit d'una llista no ordenada. Està relacionat amb el classificació ràpida algorisme d'ordenació.
Exemples:
Input: arr[] = {7, 10, 4, 3, 20, 15} k = 3 Output: 7 Input: arr[] = {7, 10, 4, 3, 20, 15} k = 4 Output: 10> L'algorisme és similar a QuickSort. La diferència és que, en lloc de repetir-se per ambdós costats (després de trobar el pivot), es repeteix només per a la part que conté l'element k-è més petit. La lògica és senzilla, si l'índex de l'element particionat és superior a k, llavors tornem a la part esquerra. Si l'índex és el mateix que k, hem trobat el k-èsim element més petit i tornem. Si l'índex és menor que k, llavors tornem a la part dreta. Això redueix la complexitat esperada de O(n log n) a O(n), amb el pitjor cas de O(n^2).
function quickSelect(list, left, right, k) if left = right return list[left] Select a pivotIndex between left and right pivotIndex := partition(list, left, right, pivotIndex) if k = pivotIndex return list[k] else if k C++14 // CPP program for implementation of QuickSelect #include using namespace std; // Standard partition process of QuickSort(). // It considers the last element as pivot // and moves all smaller element to left of // it and greater elements to right int partition(int arr[], int l, int r) { int x = arr[r], i = l; for (int j = l; j <= r - 1; j++) { if (arr[j] <= x) { swap(arr[i], arr[j]); i++; } } swap(arr[i], arr[r]); return i; } // This function returns k'th smallest // element in arr[l..r] using QuickSort // based method. ASSUMPTION: ALL ELEMENTS // IN ARR[] ARE DISTINCT int kthSmallest(int arr[], int l, int r, int k) { // If k is smaller than number of // elements in array if (k>0 && k<= r - l + 1) { // Partition the array around last // element and get position of pivot // element in sorted array int index = partition(arr, l, r); // If position is same as k if (index - l == k - 1) return arr[index]; // If position is more, recur // for left subarray if (index - l>k - 1) retorna kthSmallest (arr, l, índex - 1, k); // En cas contrari, es repeteix per al retorn de subbarray dret kthSmallest(arr, index + 1, r, k - index + l - 1); } // Si k és més que el nombre // d'elements de la matriu retorna INT_MAX; } // Programa controlador per provar els mètodes anteriors int main() { int arr[] = { 10, 4, 5, 8, 6, 11, 26 }; int n = grandària de (arr) / grandària de (arr[0]); int k = 3; cout<< 'K-th smallest element is ' << kthSmallest(arr, 0, n - 1, k); return 0; } Java // Java program of Quick Select import java.util.Arrays; class GFG { // partition function similar to quick sort // Considers last element as pivot and adds // elements with less value to the left and // high value to the right and also changes // the pivot position to its respective position // in the final array. public static int partition(int[] arr, int low, int high) { int pivot = arr[high], pivotloc = low; for (int i = low; i <= high; i++) { // inserting elements of less value // to the left of the pivot location if (arr[i] int temp = arr[i]; arr[i] = arr[pivotloc]; arr[pivotloc] = temp; pivotloc++; } } // swapping pivot to the final pivot location int temp = arr[high]; arr[high] = arr[pivotloc]; arr[pivotloc] = temp; return pivotloc; } // finds the kth position (of the sorted array) // in a given unsorted array i.e this function // can be used to find both kth largest and // kth smallest element in the array. // ASSUMPTION: all elements in arr[] are distinct public static int kthSmallest(int[] arr, int low, int high, int k) { // find the partition int partition = partition(arr, low, high); // if partition value is equal to the kth position, // return value at k. if (partition == k - 1) return arr[partition]; // if partition value is less than kth position, // search right side of the array. else if (partition 1) return kthSmallest(arr, partition + 1, high, k); // if partition value is more than kth position, // search left side of the array. else return kthSmallest(arr, low, partition - 1, k); } // Driver Code public static void main(String[] args) { int[] array = new int[] { 10, 4, 5, 8, 6, 11, 26 }; int[] arraycopy = new int[] { 10, 4, 5, 8, 6, 11, 26 }; int kPosition = 3; int length = array.length; if (kPosition>longitud) { System.out.println('Índex fora de límit'); } else { // Troba el kè valor més petit System.out.println( 'K-è element més petit de la matriu: ' + kthSmallest(arraycopy, 0, longitud - 1, kPosition)); } } } // Aquest codi és aportat per Saiteja Pamulapati Python3 # Programa Python3 de Quick Select # Procés de partició estàndard de QuickSort(). # Considera l'últim element com a pivot # i mou tots els elements més petits a l'esquerra d'ell i els més grans a la dreta def partition(arr, l, r): x = arr[r] i = l per a j en rang (l, r): si arr[j]<= x: arr[i], arr[j] = arr[j], arr[i] i += 1 arr[i], arr[r] = arr[r], arr[i] return i # finds the kth position (of the sorted array) # in a given unsorted array i.e this function # can be used to find both kth largest and # kth smallest element in the array. # ASSUMPTION: all elements in arr[] are distinct def kthSmallest(arr, l, r, k): # if k is smaller than number of # elements in array if (k>0 i k<= r - l + 1): # Partition the array around last # element and get position of pivot # element in sorted array index = partition(arr, l, r) # if position is same as k if (index - l == k - 1): return arr[index] # If position is more, recur # for left subarray if (index - l>k - 1): retorna kthSmallest(arr, l, index - 1, k) # En cas contrari es repeteix per a la subbarray dreta retorn kthSmallest(arr, index + 1, r, k - index + l - 1) print('Índex fora de lligat') # Codi del controlador arr = [ 10, 4, 5, 8, 6, 11, 26 ] n = len(arr) k = 3 print('K-è element més petit és ', final = ' ') print(kthSmallest(arr, 0, n - 1, k)) # Aquest codi és aportat per Muskan Kalra. C# // C# programa de selecció ràpida mitjançant el sistema; class GFG { // funció de partició similar a l'ordenació ràpida // Considera l'últim element com a pivot i afegeix // elements amb menys valor a l'esquerra i // valor alt a la dreta i també canvia // la posició de pivot a la seva posició respectiva / / a la matriu de només lectura. static int partitions(int []arr,int low, int high) { int pivot = arr[high], pivotloc = low, temp; per (int i = baix; i<= high; i++) { // inserting elements of less value // to the left of the pivot location if(arr[i] { temp = arr[i]; arr[i] = arr[pivotloc]; arr[pivotloc] = temp; pivotloc++; } } // swapping pivot to the readonly pivot location temp = arr[high]; arr[high] = arr[pivotloc]; arr[pivotloc] = temp; return pivotloc; } // finds the kth position (of the sorted array) // in a given unsorted array i.e this function // can be used to find both kth largest and // kth smallest element in the array. // ASSUMPTION: all elements in []arr are distinct static int kthSmallest(int[] arr, int low, int high, int k) { // find the partition int partition = partitions(arr,low,high); // if partition value is equal to the kth position, // return value at k. if(partition == k) return arr[partition]; // if partition value is less than kth position, // search right side of the array. else if(partition return kthSmallest(arr, partition + 1, high, k ); // if partition value is more than kth position, // search left side of the array. else return kthSmallest(arr, low, partition - 1, k ); } // Driver Code public static void Main(String[] args) { int[] array = {10, 4, 5, 8, 6, 11, 26}; int[] arraycopy = {10, 4, 5, 8, 6, 11, 26}; int kPosition = 3; int length = array.Length; if(kPosition>longitud) { Console.WriteLine('Índex fora de límit'); } else { // troba el kè valor més petit Console.WriteLine('K-è element més petit de la matriu: ' + kthSmallest(arraycopy, 0, longitud - 1, kPosició - 1)); } } } // Aquest codi és aportat per 29AjayKumar Javascript // Programa Javascript de selecció ràpida // funció de partició similar a l'ordenació ràpida // Considera l'últim element com a pivot i afegeix // elements amb menys valor a l'esquerra i // valor alt a la dreta i també canvia // la posició de pivot a la seva posició respectiva // a la matriu final. function _partition(arr, low, high) { let pivot = arr[high], pivotloc = low; per (deixar i = baix; i<= high; i++) { // inserting elements of less value // to the left of the pivot location if (arr[i] { let temp = arr[i]; arr[i] = arr[pivotloc]; arr[pivotloc] = temp; pivotloc++; } } // swapping pivot to the final pivot location let temp = arr[high]; arr[high] = arr[pivotloc]; arr[pivotloc] = temp; return pivotloc; } // finds the kth position (of the sorted array) // in a given unsorted array i.e this function // can be used to find both kth largest and // kth smallest element in the array. // ASSUMPTION: all elements in arr[] are distinct function kthSmallest(arr, low, high, k) { // find the partition let partition = _partition(arr, low, high); // if partition value is equal to the kth position, // return value at k. if (partition == k - 1) return arr[partition]; // if partition value is less than kth position, // search right side of the array. else if (partition return kthSmallest(arr, partition + 1, high, k); // if partition value is more than kth position, // search left side of the array. else return kthSmallest(arr, low, partition - 1, k); } // Driver Code let array = [ 10, 4, 5, 8, 6, 11, 26]; let arraycopy = [10, 4, 5, 8, 6, 11, 26 ]; let kPosition = 3; let length = array.length; if (kPosition>longitud) { document.write('Índex fora de límit'); } else { // Troba el kè valor més petit document.write( 'K-è element més petit de la matriu: ' + kthSmallest(arraycopy, 0, longitud - 1, kPosició)+' '); } // Aquest codi és aportat per rag2127 Sortida: K-è element més petit és 6 Punts importants: Igual que quicksort, és ràpid a la pràctica, però té un rendiment pobre en el pitjor dels casos. S'utilitza en El procés de partició és el mateix que QuickSort, només difereix el codi recursiu. Hi ha un algorisme que troba k-è element més petit en O(n) en el pitjor dels casos, però QuickSelect funciona millor de mitjana. Funció C++ relacionada: std::nth_element en C++>