logo

C++-ohjelma QuickSortille

Samanlainen kuin Yhdistä lajittelu -algoritmi, Quick Sort -algoritmi on Divide and Conquer -algoritmi. Se valitsee aluksi elementin pivot-elementiksi ja jakaa annetun taulukon valitun pivotin ympärille. QuickSortista on monia eri versioita, jotka valitsevat nivelen eri tavoilla.

  1. Valitse aina ensimmäinen elementti pivoiksi (toteutettu alla).
  2. Valitse aina viimeinen elementti pivoiksi.
  3. Valitse satunnainen elementti pivotiksi.
  4. Valitse kääntöpisteeksi mediaani.

QuickSortin avainprosessi on partition()-prosessi. Partition()-funktion tarkoituksena on vastaanottaa taulukko ja taulukon elementti x pivotina, laittaa x oikeaan paikkaansa lajiteltuun taulukkoon ja sitten laittaa kaikki pienemmät elementit (pienemmät kuin x) x:n eteen ja laittaa kaikki suuremmat elementit (suuremmat kuin x) x:n jälkeen. Kaikki tämä tulisi tehdä lineaarisessa ajassa, eli Big O(n) .
Pseudokoodi rekursiiviselle QuickSort-toiminnolle:



/* low -->Aloitusindeksi, korkea --> Loppuindeksi */ quickSort(arr[], matala, korkea) { if (low Method-1 : CPP // C++ Pikalajittelualgoritmin toteutus. #include käyttämällä nimiavaruutta std; int-osio(int arr[], int alku, int loppu) { int pivot = arr[alku] int count = 0 for (int i = alku + 1; i<= 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 alku, int loppu) { // peruskirjainkoko if (alku>= loppu) return;  // taulukon osiointi int p = osio(arr, alku, loppu);  // Vasemman osan lajittelu quickSort(arr, start, p - 1);  // Oikean osan lajittelu quickSort(arr, p + 1, end); } int main() { int arr[] = { 9, 3, 4, 2, 1, 8 };  int n = 6;  pikalajittelu(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 -> suurempi kuin pivotElement . Aika monimutkaisuus: θ(nlogn). Tilan monimutkaisuus: O(n). C++ // lisäsi Manish Sharma #include using namespace std; int-osio(int* arr, int alku, int loppu) { // oletetaan, että viimeinen elementti on pivotElement int index = 0, pivotElement = arr[end], pivotIndex;  int* temp = uusi int[loppu - alku + 1]; // taulukon tekeminen, jonka koko on yhtä suuri kuin nykyinen osioalue... for (int i = aloitus; 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[indeksi] = arr[i];  indeksi++;  } } // kaikki väliaikaisen taulukon elementit ovat järjestyksessä: // vasemmanpuoleiset elementit ovat pienempiä kuin pivotElement ja oikeanpuoleiset elementit ovat suurempia kuin pivotElement index = 0;  for (int i = aloitus; 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!>