算法復習-交換類排序(2)-快速排序

快速排序

快速排序通過多次劃分操作實現(xiàn)排序。
以升序為例,每趟選擇當前所有子序列中的一個關鍵字(通常是第一個)作為樞紐,將子序列中比樞紐小的移到樞紐前面,比樞紐大的移到樞紐后面;當本趟所有子序列都被樞紐以上述規(guī)則劃分后會得到新的一組更短的子序列,它們成為下一趟劃分的初始序列集。

代碼:

#include <iostream>
using namespace std;

void print_array(int array[], int n) {
  for (int i = 0; i < n; ++i)
    cout<<array[i]<<" ";
  cout<<endl;
}

void QuickSort_array(int array[], int low, int high) {
  int i, j, temp, compare;
  i = low;
  j = high;
  compare = array[i];

  if (low < high) {
    while (i < j) {
      while (j > i && array[j] >= compare)
        --j;
    
      if (i < j){
        array[i] = array[j];
        ++i;
      }

      while(i < j && array[i] < compare)
        ++i;

      if (i < j) {
        array[j] = array[i];
        --j;
      }
    }

    array[i] = compare;

    QuickSort_array(array, low, i - 1);
    QuickSort_array(array, i + 1, high);
  }
}

void QuickSort(int array[], int n) {
  QuickSort_array(array, 0, n - 1);
}

int main() {
  int array[] = {1, 5, 3, 6, 2, 9, 4};
  print_array(array, 7);
  QuickSort(array, 7);
  print_array(array, 7);
  
  return 0;
}

復雜度分析:

1. 時間復雜度
快速排序最好情況下的時間復雜度為O(nlog2^n),待排序列越接近無序,本算法效率越高。 最壞情況下的時間復雜度為O(n2),待排序列越接近有序,本算法效率越低。平均情況下時間復雜度為O(nlog2^n)??焖倥判虻呐判蛱藬?shù)和初始序列有關。
說明:還有多個時間復雜度為O(nlog2^n)的排序,但僅本算法叫做快速排序,因為這些算法的基本操作執(zhí)行次數(shù)的多項式最高次項為XO(nlog2^n)(x為系數(shù)),快速排序的x最小,可見它在同級別的算法中是最好的,因此叫快速排序。*

2. 空間復雜度
快速排序的空間復雜度是O(log2^n)??焖倥判蚴沁f歸進行的,遞歸需要棧的輔助,因此它需要的輔助空間比前面幾類排序算法大。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容