快速排序 - 一個蘿蔔一個坑

快速排序 - 一個蘿蔔一個坑

  • 快速排序算法的通俗理解

    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;
    }
  • 測試結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章