QuickSort 快排知識(shí)要點(diǎn)及一些改進(jìn)

概念

什么是快排?

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過(guò)程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。 ----百度百科

快排是一種比較算法,能夠?qū)θ魏晤愋偷臄?shù)據(jù)進(jìn)行排序,只要類型存在“小于”的關(guān)系定義??炫挪捎梅侄沃牟呗裕恳淮闻判?,都選擇一個(gè)數(shù)作為支點(diǎn),然后將大于支點(diǎn)數(shù)的放在支點(diǎn)數(shù)后,小于支點(diǎn)數(shù)的置于支點(diǎn)數(shù)前。對(duì)支點(diǎn)數(shù)前后兩部分?jǐn)?shù)據(jù)重復(fù)執(zhí)行之前過(guò)程,直至整個(gè)數(shù)組有序。支點(diǎn)數(shù)的選擇有多種策略,可以總是選擇最后一個(gè)數(shù),或第一個(gè)數(shù),或任意選擇數(shù)組中的某一個(gè)數(shù),或選擇數(shù)組的中位數(shù)。

總是選擇最后一個(gè)數(shù)作為支點(diǎn)數(shù)的代碼: (in C++)

// Always pick the last one as the pivot
int partition(vector<int>& vec, int low, int high){
  int pivot = vec[high]; // pivot element
  int i = low - 1; // smaller element index
  for(int j = low; j < high; j++){
    // if current element is less than or equal to the pivot
    if(vec[j] <= pivot){
      i++;
      if(i != j) swap(vec[i],vec[j]);
    }
  }
  swap(vec[i+1],vec[high]);
  return i+1;
}
// Using Recursion
void quickSort(vector<int>& vec, int low, int high){
  if(low < high){
    int pi = partition(vec,low,high);
    // Separately sort elements before
    // partition and after partition
    quickSort(vec, low, pi - 1);
    quickSort(vec, pi + 1, high);
  }
}
// Iteratively with Stack
void quickSort(vector<int>& vec, int low, int high){
  stack<int> s;
  s.push(low);
  s.push(high);
  while(!s.empty()){
    high = s.top();
    s.pop();
    low = s.top();
    s.pop();
    int pi = partition(vec,low,high);
    // Separately sort elements before
    // partition and after partition
    if(pi - 1 > low){
      s.push(low);
      s.push(pi-1);
    }
    if(pi + 1 < high){
      s.push(pi+1);
      s.push(high);
    }
  }
}

分析:

時(shí)間復(fù)雜度:

T(n) = T(k) + T(n-k-1) + Θ(n)

n為數(shù)組大小,k為小于pivot的數(shù)字個(gè)數(shù)。

  • worst case: 此種情況發(fā)生在總是選擇最小或最大的數(shù)作為pivot。如總是選擇最后一個(gè)數(shù)作為pivot的情形下,當(dāng)數(shù)組本身已經(jīng)是sorted情況不過(guò)是倒序時(shí),時(shí)間復(fù)雜度是O(n*n)。
  • best case: 當(dāng)總是選擇middle元素作為支點(diǎn)數(shù)的情形,時(shí)間復(fù)雜度是O(n*Logn)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,308評(píng)論 0 52
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,831評(píng)論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,357評(píng)論 0 2
  • quicksort可以說(shuō)是應(yīng)用最廣泛的排序算法之一,它的基本思想是分治法,選擇一個(gè)pivot(中軸點(diǎn)),將小于pi...
    黎景陽(yáng)閱讀 561評(píng)論 0 1
  • 娛樂(lè)圈圈真是亂,前天文章出軌,昨天又爆出陳思成,今天居然是白百合~還有誰(shuí)?貴圈真復(fù)雜。明星婚內(nèi)出軌在吃瓜群眾看來(lái)已...
    我是旭日閱讀 350評(píng)論 0 1

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