快速排序的思想是:選取乙個樞軸值,一趟排序後,將待排序列分成兩部分,左邊部分均不大於這個樞軸值,右邊部分均不小於這個樞軸值。然後再次對兩側進行快速排序,直至整個序列有序。
例項:
#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 可以在大部分的架構上很有效率地被實現出來。...