排序演算法學習 快速排序

2021-07-02 13:01:28 字數 1264 閱讀 8182

快速排序:

作為氣泡排序的一種改進;通過設定乙個標誌值(通常為陣列第乙個元素pivot),一次快排將陣列分成兩個部分,一部分(公升序–前一部分)小於標誌值pivot,另一部分大於標誌值(公升序–後面部分),各部分內部可以是(通常也是)無序的。通過遞迴地呼叫這樣的排序,使得最終陣列所有的元素有序。一次具體的快排設計如下:

#define datatype float

//針對不同的資料型別均可

void swap(datatype *a, datatype *b) //交換元素

/******一次劃分/快排操作********/

int fastsort_once(datatype *l,int low,int high)

/***************************

一種改進的方法:將privot值先暫存起來,一趟快排確定privot的

位置(返回的low值),只將l[low]或l[high]做單向移動。一趟快

排結束,將privot的值記錄在正確的位置l(low)上,對應**:

while(low=tmp)) --high;

//從後往前找第乙個小於privot的值

l[low]=l[high];

//將比privot小的記錄移至低端

while((lowreturn low;

}void fastsort_all(datatype *l,int low,int high)

}int main()

for(int i=0;i<20;i++)

cout<" ";

fastsort_all(number,0,19);

for(int i=0;i<20;i++)

cout<" ";

cout<"pause");

return

0;}

注意上面兩種方法中:「換」與「移」的區別。

注意到:通常情況下,快速排序的時間複雜度為o(nlogn),若初始記錄序列按關鍵字privot基本有序,則其退化成氣泡排序,時間複雜度變為o(n^2),這基本上是最壞的情況了,我們可以通過改進privot的值來改進演算法,通過在l[low],l[high],l[(low+high)/2]中選擇中間的值即「三者取中」的方式來進行privot值的確定。如何將已按privot有序的序列的複雜度降到o(n),可通過對修改一次劃分操作。確定了privot以後,對high減1、low增1的同時,進行起泡操作,通過兩個bool變數監督兩個子串行的起泡情況,如果有起泡,則需再排序,無起泡操作無需再進行排序

排序演算法學習 快速排序

今天演算法實驗重新學習了快速排序演算法,對此有了一些理解,把它記錄在此以供日後學習。如下為快速排序演算法的被呼叫部分。int get loc int arr int low,int high arr low arr i arr i temp return i 返回基準位置 演算法本質是從後往前與從前...

演算法學習 快速排序

快速排序 分治演算法 const int n 1e6 10 int a n a 待排序陣列,l 排序陣列的起始下標,r 排序陣列的結束下標 void quick sort int a,int l,int r 遞迴的終止條件 int x a l 選取排序的比較物件 int i l 1 設定排序的左指標...

演算法學習 快速排序

1 基本思想 取待排序陣列第乙個數作為參照數,建立left和right陣列,left儲存小於參照數的陣列集合,right儲存大於參照數的陣列集合,然後分別對left和right進行遞迴呼叫排序。2 舉例 11,2,3,43,23,5,6,9,10 取任意的乙個數為基準數 temp arr 0 遍歷陣...