快排的思路就不說了,中軸分組,借助乙個臨時單元。時間複雜度o(nlogn)。下面是實現:
#includeusing namespace std;templatebool _less(t a,t b)
a[first]=temp;
qsort(a,first,f);
qsort(a+last+1,n-last-1,f);
}templatevoid show(t a,int n)
注意幾點:
1.模板類支援預設模板引數。模板函式或者成員模板函式不支援預設模板引數(stl裡的sort是通過過載了兩份函式支援第三個引數!而不是用預設模版引數!!)
2.模版函式呼叫不要寫型別引數,編譯器自動推斷。
3.遞迴的關鍵就在於邊界條件是否考慮完全。
4.參考書表示:選取第乙個元素為中樞是錯誤的,常用的是三分中值分割法(median of three partitioning)!!就是取a[first]、a[last]、a[(first+last)/2]的中間值。
基本排序演算法之快速排序
快速排序演算法是一種劃分交換的方法,它採用分治法進行排序。其基本思想是 設要排序的 陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序不是一種穩定的 排序...
基本排序之快速排序
快速排序分為經典快速排序和隨機快速排序,因為經典快速排序在工程上使用比較少,因此本文只將隨機快速排序,它可以看作是經典快速排序的公升級版本。快速排序 概述 1 先生成乙個隨機數,作為下標,此下標對應的元素作為劃分值。2 將劃分值與元素末尾的數值進行交換,讓劃分值處於末尾。3 然後用partition...
排序演算法之快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...