快速排序 - 一個蘿蔔一個坑
-
快速排序算法的通俗理解
quick_sort簡單來說就是一種用到遞歸的分治算法,每一個遞歸基就是採用拔蘿蔔填坑的思想。假設有一排大小不同的蘿蔔,我們想要把蘿蔔從小到大挖坑進行排列,蘿蔔太多直接對比壓根看不過來,小白兔手上只能一手拿一個蘿蔔進行對比,我們需要先拔出一個蘿蔔作爲參照物,具體對比步驟如下
-
①拔出一個蘿蔔作爲參照物,具體第幾個隨意,爲了方便我們拔出第一個,此時留出一個坑。
-
②從後面往前面對比,發現比手上蘿蔔大的就跳過(因爲是從小到大排列,大蘿蔔肯定在後面),比手上蘿蔔小的放到左邊參照物的坑裏,此時右邊留個坑
-
③再從前往後對比,發現比手上蘿蔔小的就跳過(小蘿蔔放前面),比手上蘿蔔大的放到右邊留下的坑裏。
-
④重複上面②③步驟,直至從前往後和從後往前對比的蘿蔔剛好是同一個,把參照物蘿蔔埋入這個坑裏,這時在這個坑左邊的蘿蔔都比參照物左邊的小,在這個坑右邊的蘿蔔都比參照物蘿蔔大。
-
⑤遞歸調用,把參照物蘿蔔左邊和右邊的蘿蔔當做一堆新蘿蔔,進行上述①②③④的填坑,只到一堆蘿蔔只有一個,這樣蘿蔔便按順序從小到大排列了。
-
-
快速排序算法的優劣性
-
優點:快速排序是平均性能最好的算法,其時間複雜度爲O(nlogn)。
-
缺點:
-
快速排序雖然只用到了一個元素的輔助空間,但是其採用的是遞歸的思想,需要通過不斷的壓棧來進行遞歸。
-
快速排序屬於不穩定排序(不穩定排序即排序時如果兩個元素大小相等,但是仍將它們交換的排序方法)。
-
-
常見排序的時間複雜度
-
-
快速排序的代碼實現
#include <stdio.h> void quick_sort(int *buffer, int left,int right)//quick_sort function define { int i = left, j = right; int template_value = buffer[left];//選出第一個蘿蔔爲參照物蘿蔔 if(left<right)//先判斷蘿蔔堆是不是隻有一個蘿蔔 { while(i<j)//判斷蘿蔔堆從左到右和從右到左比較到同一個蘿蔔則比較完 { while(template_value<buffer[j]&&i<j)//從後往前比參照物蘿蔔大的跳過 j--; if(i<j)//從後往前比參照物蘿蔔小的放到前面坑裏 buffer[i++] = buffer[j]; while(template_value>buffer[i]&&i<j)//從前往後比參照物蘿蔔小的跳過 i++; if(i<j)//從前往後比參照物蘿蔔大的放到後面坑裏 buffer[j++] = buffer[i]; } buffer[i] = template_value;//把參照物蘿蔔填到最後一個坑裏 quick_sort(buffer,left,i-1);//將參照物蘿蔔左邊當做一個新蘿蔔堆遞歸調用 quick_sort(buffer,i+1,right);//將參照物蘿蔔右邊當做一個新蘿蔔堆遞歸調用 } } int main(int *args, char *argv[]) { int a[10]={9,7,11,2,5,7,59,62,13,0}; int i = 0; quick_sort(a,0,9); for(i=0;i<10;i++) { printf("%5d", a[i]); } printf("\n", a[i]); return 0; }
-
測試結果: