演算法 快速排序演算法

2021-06-26 21:24:00 字數 1550 閱讀 9925

快速排序的思想是:選取乙個樞軸值,一趟排序後,將待排序列分成兩部分,左邊部分均不大於這個樞軸值,右邊部分均不小於這個樞軸值。然後再次對兩側進行快速排序,直至整個序列有序。

例項:

#include "stdio.h"

#define maxsize 10

int data[maxsize] = ;

void swap(int data,int i,int j)

/** 功能:將乙個資料插到乙個左邊不大於,右邊不小於他的位置

* 輸入:1.排序陣列;2.陣列下標;3.陣列上標

* 輸出:上面功能提及的那個位置

*/int partition(int data,int low,int high)

// 直至樞軸值插到乙個左邊不大於,右邊不小於他的位置

return low;}/*

* 功能:快速排序

* 輸入:1.排序陣列;2.陣列下標;3.陣列上標

* 輸出:無

* 演算法:將乙個數放在乙個左邊不大於它右邊不小於它的位置,然後不斷遞迴

*/void quicksort(int data,int low,int high)

} void print(int *data)

void main(int argc, char* argv)

列印結果:

優化:①優化選取樞軸值

固定選取第乙個元素作為樞軸是不太合理的,因為待排序的序列可能是常常是基本有序的。partition函式顯然會做了大量的無用功,很可能成為效能的瓶頸。

方法:三數取中,取三個元素的中間值作為樞軸。最方便的做法就是選取左右兩端以及中間三個數的中間值。

int pivotkey;  

/*三數取中以獲得較好的樞軸值*/

int m = low + (high-low)/2;

if(data[low] > data[high])

swap(data,low,high);

if(data[m] > data[high])

swap(data,m,high);

if(data[m] > data[low])

swap(data,m,low);

pivotkey = data[low]; // 選取乙個數值盡量靠中間的為樞軸

②優化不必要的交換

while(low < high)  

data[low] = pivotkey;

③優化遞迴操作,遞迴對效能無疑有一定影響,尤其是在遞迴深度越深時。

while(low < high)

做了乙個小測試,選的值都是比較適中的。因為測試的都是隨機數,所以第乙個優化基本無效,第二個優化就是這次比較的結果,第三個優化應該對時間效能上影響不大。

快速排序法的平均時間複雜度是o(nlogn)

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

演算法 排序演算法 快速排序

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...

演算法 快速排序演算法

快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實現出來。...