logo

C++ Program pre QuickSort

Podobné ako Zlúčiť triedenie Algoritmus rýchleho triedenia je algoritmus rozdeľovania a panovania. Najprv vyberie prvok ako prvok pivota a rozdelí dané pole okolo vybraného pivotu. Existuje mnoho rôznych verzií quickSort, ktoré vyberajú pivot rôznymi spôsobmi.

  1. Vždy vyberte prvý prvok ako pivot (implementovaný nižšie).
  2. Vždy vyberte posledný prvok ako pivot.
  3. Vyberte náhodný prvok ako pivot.
  4. Vyberte medián ako pivot.

Kľúčovým procesom v quickSort je proces partition(). Cieľom funkcie partition() je prijať pole a prvok x poľa ako pivot, umiestniť x na správnu pozíciu v triedenom poli a potom umiestniť všetky menšie prvky (menšie ako x) pred x a umiestniť všetky väčšie prvky (väčšie ako x) po x. Toto všetko by sa malo uskutočniť v lineárnom čase, t. j. Big O(n) .
Pseudokód pre rekurzívnu funkciu QuickSort:



/* low -->Počiatočný index, vysoký --> Koncový index */ quickSort(arr[], low, high) { if (low Metóda-1 : CPP // C++ Implementácia algoritmu rýchleho triedenia. #include using namespace std; int partition(int arr[], int zaciatok, int koniec) { int pivot = arr[zaciatok] int pocet = 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čiatok, int koniec) { // základný prípad if (začiatok>= koniec) return;  // rozdelenie poľa int p = partition(arr, start, end);  // Triedenie ľavej časti quickSort(arr, start, p - 1);  // Triedenie pravej časti 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äčší ako pivotElement . Časová zložitosť: θ(nlogn). Priestorová zložitosť: O(n). C++ // pridal Manish Sharma #include using namespace std; int partition(int* arr, int start, int end) { // za predpokladu, že posledný prvok je pivotElement int index = 0, pivotElement = arr[end], pivotIndex;  int* temp = new int[end - start + 1]; // vytvorenie poľa, ktorého veľkosť sa rovná aktuálnemu rozsahu oblastí... for (int i = štart; 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šetky prvky teraz v poli temp sú v poradí: // prvky najviac vľavo sú menšie ako pivotElement a prvky úplne vpravo sú väčšie ako pivotElement index = 0;  for (int i = začiatok; 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!>