1、基本介紹:
實際中最常用的排序算法,期望時間複雜度O(nlgn),且常係數很小。
分治理念步驟:
2、C++代碼及步驟:
思路:
1、選主元;
2、小於主元放左邊,大於主元放右邊,主元放中間,遞歸調用,直到左邊指針>=
右邊指針。
注:當待排元素少時,效果不如插入排序,因此下面代碼在元素少於100用了插入排序。
void QuickSort(int* A,int N) //算法接口
{
QuickSortReal(A,0,N-1); //主函數入口
}
void QuickSortReal(int* A,int left, int right)
{
if(100<=right-left){ //若待排數組大則用快排,小則用插入排序
int pivot = Medion3(A, left, right) //選主元,可以直接用數組最後一個值作爲主元
int i = left; //此位置目前小於主元
int j = right-1; //此位置目前是主元
for(;;){
while(A[++i]<pivot){} //左邊大於主元的於
while(A[--j]>pivot){} //右邊小於主元的交換
if(i<j) swap(A[i],A[j]);
else break;
}
swap(A[i],A[right-1]); //將主元放在中間位置,i爲主元所在下標
QuickSortReal(A,left,i-1);
QuickSortReal(A,i+1,right);
}
else{ // 插入排序
InsertionSort(A,left,Right-left+1);
}
}
int Medion3(int* A,int left, int right) //用於選主元,此部分可以不要,
//直接用數組最後一個元素左主元
{
int center = (left+right)/2;
if(A[left]>A[center]) swap(A[left],A[center];)
if(A[left]>A[right]) swap(A[left],A[right];)
if(A[center]>A[right]) swap(A[center],A[right];)
swap(A[center],A[right-1]); //將主元放數組右邊倒數第二位
return A[right-1];
}
參考資料: 算法導論7.1節:快速排序的描述
總結:
1、快速排序爲最常用的算法。
2、通常將數組中最後一個元素作爲主元。