快速排序通常是排序的最佳選擇,因為其平均的執行時間為o(nlgn )。最壞情況下每次劃分都產生兩個分別包含n-1個元素和乙個元素的區域,此時時間複雜度為o(n²)。最佳情況下每次劃分都將陣列分成兩個長度差不多的區域,此時時間複雜度與平均效能差不多。快速排序的遞迴形式如下:
快速排序採用分治思想,其中partition函式實現的就是「分」,它將array[low,high]分成兩部分,其中前一部分中的元素均小於後一部分中的元素。然後遞迴呼叫快速排序對分出來的兩部分進行快速排序。void do_quick_sort( int array, int low, int high )
}
partition函式的**如下:
該函式可以分為4步理解:int partition( int array, int low, int high )
array[low] = current;
return low;
}
1.從後向前尋找第乙個小於current的元素,找到後將它賦值給array[low](array[low]已經由current儲存,這也是劃分的基準值),
2.然後從前向後尋找第乙個大於current的元素,找到後將它賦值給array[high],
3.重複1、2,直至low==high,
4.將current賦值給array[low](或array[high]),這時current前面的值都小於等於它,後面的值都大於等於它,這樣array就被分成的兩部分
有幾個問題需要注意:
1.不論從前向後查詢或是從後向前查詢都要判斷low2.由於是遞迴演算法,所以程式中必須要有遞迴結束的條件,即:low>high,所以如果low快速排序還有幾個優化版本,隨機化快排就是其中之一,這樣是期望對陣列的劃分更加對稱,避免最壞情況的發生。在隨機化版本中,只需對partition函式進行修改就可以了。
int randomized_partition( int array, int low, int high )
return partition( array, low, high );
}
通過隨機指定[low,high]中的元素作為主元,可以獲得較好的平均情況效能。很多人認為,快排的隨機化版本是對足夠大的輸入的理想選擇。
快速排序 遞迴實現
快速排序演算法 用到了 分治法 遞迴演算法 package com.xiahui public class quicksort quicksort quicksort new quicksort quicksort.quicksort a,0,6 for int i 0 i a.length i p...
快速排序 遞迴實現
快速排序演算法 用到了 分治法 遞迴演算法 package com.xiahui public class quicksort quicksort quicksort new quicksort quicksort.quicksort a,0,6 for int i 0 i a.length i p...
遞迴實現快速排序
所有查詢中hash查詢效率最高,在所有排序中,快速排序的效率也是最高的。採用遞迴函式的方法來實現快速排序!include include include intquick sort int int,int int partion int int,int int main int argc,const...