排序––快速排序(一)

     快速排序沒有冒泡、選擇、插入排序來得直觀,因此通常也很難想到(很佩服改算法的發明人),我認爲一種容易理解的方式是與二分查找算法進行類比。確定有人說一個是排序算法另外一個是查找算法顯得八杆子打不着,其實否則。算法

      二分查找基於已經有序數組,每次查找時從處於中間位置的元素開始查找,若是比中間元素大從右邊的另外一半進行二分查找反之從左邊的一半開始,如此循環直到找到匹中的元素,因此二分查找的時間複雜度是logN。數組

       現假設有3個不重複元素須要排序,若是正好選擇了中間元素並將比它大的元素排在右邊,小的元素排在左邊就完成了排序過程;若是有7個不重複元素,一樣選擇某中間元素能將7個元素平分紅兩半,將比它大的元素排在右邊,小的元素排在左邊,而後再分別對兩邊的3個不重複元素進行這樣的步驟,這樣只須要3次這樣的步驟就能夠完成排序!很明顯這個步驟與二分查找是相似的,對於有N個不一樣元素的序列來講這個分割的步驟須要進行logN次。第一次分割步驟須要比較N-1次,第二次分割步驟須要比較N-3次,最終時間複雜度是NlogN級別的。排序

       這裏有一個關鍵問題是如何保證每次選中的元素能正好將序列分紅個數相同的兩半,後面會結合lucene的源碼進行說明,並對算法的時間複雜度的細節以及穩定性等問題進行重點解析。源碼

相關文章
相關標籤/搜索