如果看不懂這些乾巴巴的理**字,那就先不用看了,下面**中有詳細的注釋,大家可以先跟著**走幾遍,回過頭來再看這些文字描述,總之:紙上得來終覺淺,絕知此事要躬行。
排序演算法哪家強,從實際應用的角度上將,快排表現很好。很自然地,人們會覺得短陣列比長陣列更好處理,因此可能會想到將原始陣列分為若干各子部分然後分別進行排序。快速排序就是基於分治法的排序演算法,這不過它更多地側重於「分」,沒有明顯的「合」過程。
1.快排演算法的主要思想:
(1)從待排序序列s中「任意」選擇乙個記錄k作為軸值(pivot)。
(2)將剩餘的記錄分割(partition)成左子串行l和右子串行r。
(3)l中所有記錄都小於或等於k,r中記錄都大於等於k,因此k正好位於正確的位置。
(4)對子序列l和r遞迴進行快速排序,直到子串行中只含有0或1個元素,退出遞迴。
2.如何選擇軸值pivot,這對快排的時間效能影響很大,軸值的選擇應盡量使得序列可以據此劃分為均勻的兩半。
3.如何實現最關鍵的分割的過程:最簡單的分割方法就是左指標l和右指標r(下標)分別從序列的左端、右端向序列中間掃瞄;左邊越過那些小於等於pivot的值,停在第乙個大於pivot的值kl;右邊越過那些大於等於pivot的值,停在第乙個小於pivot的值kr;交換逆置記錄kl和kr;從交換後的位置,繼續從左右向中間掃瞄,發現並交換逆置記錄對,直到l、r交叉而整個序列掃瞄完畢。這種方法適用於需要處理l、r邊界,軸值最後定位等情況。
4. 由於遞迴開銷過大,所以當子串行足夠短時,我們採用插入排序來完成對子序列的排序。
5. 快速排序之所以快是因為:它每次選定軸值pivot並進行劃分子集(分割交換)後該軸值被一次性的放到了他最終該放到的位置。
下面以一趟分割交換為例:下標0
1234
567初始
2534
4532
34`12
2964
選基準25
3445
2934`
1232
64分割
2512
4529
34`34
3264
分割25
1229
4534`
3432
64基準定位
2512
2932
最終位置
34`34
4564
//#pragma once
#include using namespace std;
const int cutoff = 28; //閾值,當子串行元素個數小於cutoff時,採用簡單排序
template class quick
//析構函式
void quicksort(int left, int right); //遞迴進行快排
t median3(int left, int right); //選主原(軸值)- 取頭、中、尾的中位數
friend void swap(t* a, t* b); //交換兩個數 - 友元函式
void insertsort(t* b, int nb); //當子串行元素個數小於閾值時呼叫插入排序
void print(); //輸出結果
};//quick類的實現
//建構函式初始化
template quick::quick(int size)
//交換兩個數
template swap(t* a, t* b)
//輸出結果
template void quick::print()
}//插入排序
template void quick::insertsort(t* b, int nb)
a[i] = tmp; //新牌歸位 }}
//選軸值pivot
template t quick::median3(int left, int right)
//遞迴分割
template void quick::quicksort(int left, int right)
//將當前子串行的軸值一次性的放到他最終所在的位置上 - low
swap(&a[low], &a[right - 1]);
//當前子串行分割完成,遞迴進入更小一層子串行的分割
quicksort(left, low - 1); //遞迴解決左邊子串行
quicksort(low + 1, right); //遞迴解決右邊子串行
} else
insertsort(a + left, right - left + 1); //當子串行足夠短時,採用插入排序
排序 快速排序(C )
1 演算法描述 1.1 設當前參加排序的陣列為array 0.n 1 選擇乙個元素 通常稱該元素為基準元素 作為基準元素 將小於或者等於基準元素的所有元素都移到基準元素的左邊 把大於或者等於基準元素的所有元素都移到分界元素的右邊 執行完 2 3 步驟後,基準元素左邊元素序列,基準元素,基準元素右邊元...
排序演算法 快速排序 C
單向掃瞄就地重排 int partitation 1way int array,int nidxleft,int nidxright return nidxsmall 雙向掃瞄就地重排 int partitation 2way int array,int nidxleft,int nidxright...
排序 C 快速排序模板
無注釋的 include using namespace std const int n 100005 int a n void quicksort int q,int l,int r int index q l r 1 int i l 1,j r 1 while i j while q i ind...