1. 程式人生 > >排序算法入門之快速排序(java實現)

排序算法入門之快速排序(java實現)

大小 ava 相對 其余 時間 個數 技術分享 算法 元素交換

  快速排序也是一種分治的排序算法。快速排序和歸並排序是互補的:歸並排序將數組分成兩個子數組分別排序,並將有序的子數組歸並以將整個數組排序,會需要一個額外的數組;而快速排序的排序方式是當兩個子數組都有序時,整個數組就自然有序了,快速排序可以不產生額外的數組。

對於小數組(N<=20),快速排序不如插入排序。所以,小數組建議使用其他排序。

  快速排序可以由以下幾步組成:

  1.如果數組S中的元素個數是0或1,則返回。

  2.取S中任一元素v,稱為樞紐元。

  3.將S中其余元素(除樞紐元)分為兩部分,一部分是小於v的,放在v的左邊,一部分是大於v的,放在v的右邊。

  4.再將左右兩部分繼續遞歸快速排序。

細節:

  1.選取樞紐元

    一種通常的、無知的選擇就是選取第一個元素用作樞紐元。如果輸入是隨機的,那麽這也是可以接受的,而如果輸入是預排序的或者反序的,這樣的分割就毫無意義,因為所有元素都是比第一個元素大或都比它小,這樣就只會劃分成一部分。此時花費的時間是二次的,而實際上卻沒有幹什麽事。

    一般的做法是使用左端、右端和中心位置上的三個元素的中值(中間大小的那個數)作為樞紐元。

  2.分割策略

    在分割階段要做的就是把小於樞紐元的元素移到數組左邊,把大於樞紐元的元素移到數組右邊。

     先假設所有元素互異。方法是:將樞紐元與最後一個元素交換位置,使樞紐元離開要被分割的數據段。i 從第一個元素開始,j 從倒數第二個元素開始。當 i 在 j 左邊時,將 i 右移,移過那些小於樞紐元的元素(這些元素就該放在數組左邊),並將 j 左移,移過那些大於樞紐元的元素。當 i 和 j 停止時,說明此事 i 指向了一個比樞紐元大的元素,j 指向了一個比樞紐元小的元素。如果 i 比 j 小,則交換這兩個元素,也就是把i指向的大元素(相對於樞紐元)放到數組右邊,j 指向的小元素放到數組左邊,然後 i 和 j 繼續移動。如果 i 大於 j ,說明已經移動結束,此時i左邊都是比樞紐元小的, i 的右邊(包括i)都是比樞紐元大的。最後將 i 元素與樞紐元互換。

    如果 i 和 j 遇到了與樞紐元相同的元素,那麽也應該停下來。

  代碼:

技術分享

本博客參考《數據結構與算法分析java語言描述》

排序算法入門之快速排序(java實現)