logo

C++ Program pro QuickSort

Podobné jako Sloučit třídění Algoritmus rychlého třídění je algoritmem rozděl a panuj. Nejprve vybere prvek jako prvek pivotu a rozdělí dané pole kolem vybraného pivotu. Existuje mnoho různých verzí quickSort, které vybírají pivot různými způsoby.

  1. Vždy vyberte první prvek jako pivot (implementováno níže).
  2. Vždy vyberte poslední prvek jako pivot.
  3. Vyberte náhodný prvek jako pivot.
  4. Vyberte medián jako pivot.

Klíčovým procesem v quickSortu je proces partition(). Cílem funkce partition() je přijmout pole a prvek x pole jako pivot, umístit x na správnou pozici v setříděném poli a poté umístit všechny menší prvky (menší než x) před x a umístit všechny větší prvky (větší než x) po x. To vše by mělo být provedeno v lineárním čase, tj. Big O(n) .
Pseudokód pro rekurzivní funkci QuickSort:



/* low -->Počáteční index, vysoký --> Konečný index */ quickSort(arr[], nízký, vysoký) { if (nízký Metoda-1 : CPP // C++ Implementace algoritmu rychlého třídění. #include using namespace std; int partition(int arr[], int začátek, int konec) { int pivot = arr[start]; int počet = 0;<= end; i++) {  if (arr[i] <= pivot)  count++;  }  // Giving pivot element its correct position  int pivotIndex = start + count;  swap(arr[pivotIndex], arr[start]);  // Sorting left and right parts of the pivot element  int i = start, j = end;  while (i pivotIndex) {  while (arr[i] <= pivot) {  i++;  }  while (arr[j]>pivot) { j--;  } if (i pivotIndex) { swap(arr[i++], arr[j--]);  } } return pivotIndex; } void quickSort(int arr[], int začátek, int konec) { // základní případ if (začátek>= konec) return;  // rozdělení pole int p = partition(arr, start, end);  // Třídění levé části quickSort(arr, start, p - 1);  // Třídění pravé části quickSort(arr, p + 1, end); } int main() { int arr[] = { 9, 3, 4, 2, 1, 8 };  int n = 6;  quickSort(arr, 0, n - 1);  for (int i = 0; i cout<< arr[i] << ' ';  }  return 0; }  Output  1 2 3 4 8 9  Method-2 : This method’s space complexity is O(n). As we will take an extra array in partition function like in merge function of merge sort .  Algorithm explanation and steps of partition function:   Make a new array of size equal to given array. push all the smaller elements than pivotElement to the new array. Push pivotElement to new array now. finally, push all the greater elements than pivotElement to the new array. Now, copy the new array to the original array. Store the index of the pivotElement from the original array. Return this index.  After this, all the elements in the original array are in the order : smaller than pivotElement ->pivotElement -> větší než pivotElement . Časová složitost: θ(nlogn). Prostorová složitost: O(n). C++ // přidal Manish Sharma #include using namespace std; int partition(int* arr, int start, int end) { // za předpokladu, že poslední prvek je pivotElement int index = 0, pivotElement = arr[end], pivotIndex;  int* temp = new int[end - start + 1]; // vytvoření pole, jehož velikost je rovna aktuálnímu rozsahu oddílu... for (int i = start; i<= end; i++) // pushing all the elements in temp which are smaller than pivotElement  {  if(arr[i]   {  temp[index] = arr[i];  index++;  }  }  temp[index] = pivotElement; // pushing pivotElement in temp  index++;  for (int i = start; i // pushing all the elements in temp which are greater than pivotElement  {  if(arr[i]>pivotElement) { temp[index] = arr[i];  index++;  } } // všechny prvky nyní v poli temp jsou v pořadí : // prvky nejvíce vlevo jsou menší než pivotElement a prvky nejvíce vpravo jsou větší než pivotElement index = 0;  for (int i = začátek; i<= end; i++) // copying all the elements to original array i.e arr  {   if(arr[i] == pivotElement)  {  // for getting pivot index in the original array.  // we need the pivotIndex value in the original and not in the temp array  pivotIndex = i;  }  arr[i] = temp[index];  index++;  }  return pivotIndex; // returning pivotIndex } void quickSort(int* arr, int start, int end) {   if(start   {   int partitionIndex = partition(arr, start, end); // for getting partition  quickSort(arr, start, partitionIndex - 1); // sorting left side array  quickSort(arr, partitionIndex + 1, end); // sorting right side array  }  return; } int main()  {   int size = 9;  int arr[size] = {5, 12, 7, 1, 13, 2 ,23, 11, 18};    cout << 'Unsorted array : ';  for (int i = 0; i   {  cout << arr[i] << ' ';  }  printf('
');  quickSort(arr, 0, size - 1);    cout << 'Sorted array : ';  for (int i = 0; i   {  cout << arr[i] << ' ';  }    return 0; }  Output  Unsorted array : 5 12 7 1 13 2 23 11 18 Sorted array : 1 2 5 7 11 12 13 18 23  Please refer complete article on QuickSort for more details!>