快速排序 是整個排序演算法中速度最快的,也是我所要介紹的最後一種排序方式。
它以o (n
lgn)
o(n\lg n)
o(nlgn)
的速度雄踞最快的排序方式,並應用在了多種語言中,例如c語言的qsort
、c++的sort
等,並且侷限很小。
接下來介紹 快速排序 的主要原理。
快速排序的主要思想是分治思想(divide and conquermethod)。
基本原理是:
從數列中取出乙個基準數
將比這個數大的數字放在它的右邊,小於或等於它的數放在它的左邊
對左右區間重複第二步,直至各個區間只有乙個數字。
void
fastsort
(int
*arr,
int left,
int right)
arr[i]
= arr[j]
;while
(i < j && key >= arr[i]
) arr[j]
= arr[i];}
arr[i]
= key;
fastsort
(arr, left, i -1)
;fastsort
(arr, i +
1, right)
;}
例如,排序5 3 2 8 4 9 2 0 1
key = 5, x 3 2 8 4 9 2 0 1, i = 0, j = 8
key = 5, 1 3 2 8 4 9 2 0 x, i = 0, j = 8
key = 5, 1 3 2 x 4 9 2 0 8, i = 3, j = 8
key = 5, 1 3 2 0 4 9 2 x 8, i = 3, j = 7
key = 5, 1 3 2 0 4 x 2 9 8, i = 5, j = 7
key = 5, 1 3 2 0 4 2 x 9 8, i = 5, j = 7
key = 5, 1 3 2 0 4 2 5 9 8, i = 7, j = 7
此時完成一輪排序,pos<7的位置全部都不大於5,pos大於7的位置全部都不小於5
重複上述流程即可完成排序
使用非遞迴方法,需要自己定義乙個棧來進行
void
fastsort
(int
*arr,
int size)
arr[i]
= key;
stack[
++ pos]
= left;
// 遞迴入棧
stack[
++ pos]
= i -1;
stack[
++ pos]
= i +1;
stack[
++ pos]
= right;}}
}
使用gcc聯合編譯進行編譯:
gcc -wall fastsort.c -c
gcc -wall main.c fastsort.o -o main
main檔案的內容:
#include
#include
"fastsort.h"
intmain()
;fastsort
(arr,9)
;for
(int i =
0; i <
9; i ++
)printf
("%d "
, arr[i]);
printf
("\n");
return0;
}
fastsort.h的內容
#ifndef fast_sort
#define fast_sort
void
fastsort
(int
*arr,
int size)
;#endif
執行結果
$ ./main
0 1 2 2 3 4 5 8 9
排序演算法 快速排序演算法
網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...
演算法 排序演算法 快速排序
快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...
排序演算法 快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 1.從數列中挑出乙個元素,稱為 基準 pivot 2.重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分...