排序 快速排序(C )

2021-08-20 06:49:30 字數 2391 閱讀 5024

如果看不懂這些乾巴巴的理**字,那就先不用看了,下面**中有詳細的注釋,大家可以先跟著**走幾遍,回過頭來再看這些文字描述,總之:紙上得來終覺淺,絕知此事要躬行。

排序演算法哪家強,從實際應用的角度上將,快排表現很好。很自然地,人們會覺得短陣列比長陣列更好處理,因此可能會想到將原始陣列分為若干各子部分然後分別進行排序。快速排序就是基於分治法的排序演算法,這不過它更多地側重於「分」,沒有明顯的「合」過程。

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...