Greito pasirinkimo algoritmas

Greitas pasirinkimas yra atrankos algoritmas, skirtas rasti k-ąjį mažiausią elementą netvarkingame sąraše. Tai susiję su greitas rūšiavimas rūšiavimo algoritmas.
Pavyzdžiai:

Input: arr[] = {7, 10, 4, 3, 20, 15} k = 3 Output: 7 Input: arr[] = {7, 10, 4, 3, 20, 15} k = 4 Output: 10 

Algoritmas panašus į QuickSort. Skirtumas yra tas, kad užuot pasikartojęs abiejose pusėse (radus sukimąsi), jis kartojasi tik toje dalyje, kurioje yra k-tas mažiausias elementas. Logika paprasta, jei padalinto elemento indeksas didesnis nei k, tai kartojame kairiajai daliai. Jei indeksas yra toks pat kaip k, mes radome k-tą mažiausią elementą ir grįžtame. Jei indeksas yra mažesnis nei k, tai kartojame dešinėje dalyje. Tai sumažina numatomą sudėtingumą nuo O(n log n) iki O(n), o blogiausiu atveju 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) return kthMallest(arr, l, index - 1, k);     // Kitaip pasikartoja dešiniojo pogrupio grąža kthMallest(arr, index + 1, r, k - index + l - 1);   } // Jei k yra daugiau nei // elementų skaičius masyve, grąžinama INT_MAX;  } // Tvarkyklės programa, skirta patikrinti aukščiau pateiktus metodus int main() { int arr[] = { 10, 4, 5, 8, 6, 11, 26 };   int n = dydis(arr) / dydis(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>ilgis) { System.out.println('Indeksas neribotas');   } else { // rasti k-tą mažiausią reikšmę System.out.println( 'K-tas mažiausias elementas masyve : ' + kthMallest(masyvo kopija, 0, ilgis - 1, kPosition));   } } } // Šį kodą sukūrė Saiteja Pamulapati Python3 # Python3 programa Quick Select # Standartinis QuickSort() skaidinio procesas.  # Paskutinį elementą jis laiko sukimo tašku # ir visus mažesnius elementus perkelia į kairę nuo jo ir didesnius elementus į dešinįjį def skirsnį (arr, l, r): x = arr[r] i = l j diapazone (l, r): jei 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 ir 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): return kthMallest(arr, l, index - 1, k) # Kitu atveju pasikartokite dešinėje posistemėje return kthMallest(arr, index + 1, r, k - index + l - 1) print('Index out of bound') # Tvarkyklės kodas arr = [ 10, 4, 5, 8, 6, 11, 26 ] n = len(arr) k = 3 print('K-tas mažiausias elementas yra ', pabaiga = ' ') print(kthMallest(arr, 0, n - 1, k)) # Šį kodą pateikė Muskanas Kalra.   C# // Greitojo pasirinkimo C# programa naudojant sistemą;    class GFG { // skaidinio funkcija, panaši į greitą rūšiavimą // Paskutinis elementas laikomas sukančiu elementu ir prideda // elementus su mažesne verte kairėje ir // didelės reikšmės dešinėje, taip pat pakeičia // sukimosi padėtį į atitinkamą padėtį / / tik skaitomame masyve.   statinės int skirsniai (int []arr,int žemas, int aukštas) { int pivot = arr[aukštas], pivotloc = žemas, temp;   for (int i = žemas; 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>ilgis) { Console.WriteLine('Indeksas neribotas');   } else { // rasti k-tą mažiausią reikšmę Console.WriteLine('K-tas mažiausias elementas masyve : ' + kthMallest(masyvo kopija, 0, ilgis - 1, kPosition - 1));   } } } // Šį kodą įtraukė 29AjayKumar Javascript // Greitojo pasirinkimo Javascript programa // skaidinio funkcija, panaši į greitąjį rūšiavimą // Paskutinis elementas laikomas suvesiniu ir prideda // elementus, kurių vertė mažesnė ir // didelė reikšmė į dešinę ir taip pat pakeičia // sukimosi padėtį į atitinkamą padėtį // galutiniame masyve.  function _partition(arr, low, high) { let pivot = arr[high], pivotloc = žemas;   for (tegul i = mažas; 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>ilgis) { document.write('Index out of bound ');  } else { // rasti k-tą mažiausią reikšmę document.write( 'K-tas mažiausias elementas masyve : ' + kthMallest(masyvo kopija, 0, ilgis - 1, kPosition)+' ');  } // Šį kodą įnešė rag2127 Išvestis: K-tas mažiausias elementas yra 6 Svarbūs punktai: Kaip ir greitasis rūšiavimas, praktiškai jis yra greitas, tačiau blogiausiu atveju veikia prastai. Jis naudojamas skirstymo procesas yra toks pat kaip QuickSort, skiriasi tik rekursinis kodas. Egzistuoja algoritmas, kuris blogiausiu atveju randa k-ąjį mažiausią elementą O(n), tačiau „QuickSelect“ veikia vidutiniškai geriau.    Susijusi C++ funkcija : std::nth_element C++