資料結構與演算法 快速排序 1

2021-10-25 17:58:12 字數 2194 閱讀 6069

目錄

1.起源

2.演算法思想

3.時間複雜度

4.**實現

5.測試案例

0.附錄工具函式

2023年由查爾斯·安東尼·理查德·霍爾(charles antony richard hoare,縮寫為c. a. r. hoare) 提出。

①從陣列中選擇乙個軸點元素(pivot)

假設每次選擇0位置的元素為軸點元素

②利用pivot將陣列分割成2個子陣列

將小於pivot的元素放在pivot前面(左側)

將大於pivot的元素放在pivot後面(右側)

等於pivot的元素放哪邊都可以

③對子陣列進行①②操作

直到不能再分割(子陣列中只剩下1個元素)。

本質上來說,就是逐漸將每乙個元素都轉換成軸點元素。

也就是說,迴圈掃瞄一遍陣列後,就將軸點元素放在中間了,其中左邊的一定是小於等於它的,反之亦然。

在軸點左右元素數量比較均勻的情況下,同時也是最好的情況

t(n)= 2* t(n/2) + 0(n) = 0(nlogn)。

如果軸點左右元素數量極度不均勻,則是最壞情況,

t(n)= t(n- 1)+ 0(n)= 0(n^2)。

那有沒有辦法降低最壞情況出現的概率呢?答案是肯定的。

我們一般採取的做法就是:隨機選擇軸點元素。

最好、平均時間複雜度: 0(nlogn)。

最壞時間複雜度: 0(n^2)。

由於遞迴呼叫的緣故,空間複雜度: 0(logn)。

屬於不穩定排序。

版本實現1

void quicksort1(int* array, int length) 

void quicksort1(int* array, int begin, int end)

int pivotindex1(int* array, int begin, int end)

array[begin] = array[right];  // 此時right指向的元素必然<=pivot,所以把它放在陣列begin的位置

array[right] = pivot;  // 把軸點元素放到中間

return right;

}

版本實現2

void quicksort2(int* array, int length) 

void quicksort2(int* array, int begin, int end)

int pivotindex2(int* array, int begin, int end) else

}while (begin < end) else }}

array[begin] = pivot;

return begin;

}

int main() ;

int length0 = sizeof(array0) / 4;

quicksort1(array0, length0);

printarray(array0, length0);

/*快速排序2*/

int array1 = ;

int length1 = sizeof(array1) / 4;

quicksort2(array1, length1);

printarray(array1, length1);

system("pause");

return 0;

}

void printarray(int* array, int length) 

cout << endl;

}

資料結構與演算法 排序演算法 快速排序

源 cpp view plain copy include void quicksort int int,int intfindposs int int,int intmain quicksort arry,0,6 printf after sorted n for i 0 i 7 i printf...

資料結構與演算法 快速排序

基礎概念 快速排序,聽這個名字就能想到它排序速度比較快方法,是一種分治思想。所謂分治,就是指以乙個數為基準,將序列中的其他數往它兩邊 扔 以從小到大排序為例,比它小的都 扔 到它的左邊,比它大的都 扔 到它的右邊,然後左右兩邊再分別重複這個操作,不停地分,直至分到每乙個分割槽的基準數的左邊或者右邊都...

資料結構與演算法 快速排序

快速排序在實際應用中使用廣泛,效果也高。快排使用的是分治策略,一組序列基於某乙個基準值分成兩個大小的子串行,遞迴排序子串行,最終得到有序的序列。快排的平均時間複雜度為o nlogn 演算法的實現步驟 1.在序列中挑選乙個基準值,我們可以預設第乙個數為基準值 2.從兩邊的數值跟基準值作對比,數值小的放...