C++基礎之快速排序實現(面試常考)


概念

快速排序是對冒泡排序的一種改進,非穩定排序,也就是說需要的排序數據中如果出現了同值的時候,排序結束,該值可能被交換過(算法時間複雜度爲O(n*n))

思想

核心關鍵在於在於利用某個key值,通過一趟排序將整體數據分組劃分爲兩個獨立部分,一部分的所有數值均比另一部分的所有數值都大或小,然後以同樣方式處理分成的兩個部分,整個過程是個遞歸進行的過程,直至數據不再劃分,即完成排序。

一:趟快速排序的算法是:
1設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
2以第一個數組元素作爲關鍵數據,賦值給key,即key=A[0];
3從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於key的值A[j],將A[j]賦值給A[i] ( A[i]=A[j] );
4從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的A[i],將A[i]賦值給A[j] ( A[j]=A[i] );
5重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到爲止。找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令循環結束)。
二:遞歸處理1-5過程
三:實現如下
1
2
3
4
5
void* quickSort(int a[], int minSize, int maxSize);
int arrayN[] = {6,2,7,5,4,9,1,8,3};

quickSort(arrayN,0,8)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
//  快速排序遞歸實現
void* quickSort(int a[], int minSize, int maxSize)
{
if (minSize >= maxSize)
{
return nullptr;
}


int beginIndex = minSize, endIndex = maxSize;
int key = a[beginIndex];
int *pArray = a;


while (beginIndex < endIndex)
{
while ( beginIndex < endIndex && pArray[endIndex] >= key)
{
endIndex--;
}


pArray[beginIndex] = pArray[endIndex];


while ( beginIndex < endIndex && pArray[beginIndex] <= key)
{
beginIndex++;
}


pArray[endIndex] = pArray[beginIndex];


}


pArray[beginIndex] = key;
quickSort(a,minSize,beginIndex-1);
quickSort(a,beginIndex+1,maxSize);
}
發佈了33 篇原創文章 · 獲贊 10 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章