Java學習之7種排序演算法的完整例項程式碼

tianxiaoxu發表於2018-06-28

【本文轉自爪哇筆記 作者:Java 愛好者,原文連結:https://mp.weixin.qq.com/s/SJ_pJ9BnXFuMkIQqyRAvDA】
排序

排序是計算機內經常進行的一種操作,其目的是將一組“無序”的記錄序列調整為“有序”的記錄序列。分內部排序和外部排序,若整個排序過程不需要訪問外存便能完成,則稱此類排序問題為內部排序。反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成,則稱此類排序問題為外部排序。內部排序的過程是一個逐步擴大記錄的有序序列長度的過程。

概念

將雜亂無章的資料元素,通過一定的方法按關鍵字順序排列的過程叫做排序。

Java學習之7種排序演算法的完整例項程式碼

常見排序演算法

快速排序、希爾排序、堆排序、直接選擇排序不是穩定的排序演算法,而基數排序、氣泡排序、直接插入排序、折半插入排序、歸併排序是穩定的排序演算法。

分類

穩定排序:假設在待排序的檔案中,存在兩個或兩個以上的記錄具有相同的關鍵字,在 用某種排序法排序後,若這些相同關鍵字的元素的相對次序仍然不變,則這種排序方法 是穩定的。其中冒泡,插入,基數,歸併屬於穩定排序,選擇,快速,希爾,堆屬於不穩定排序。

就地排序:若排序演算法所需的輔助空間並不依賴於問題的規模n,即輔助空間為O(1), 則稱為就地排序。

排序演算法

氣泡排序

持續比較相鄰元素,大的挪到後面,因此大的會逐步往後挪,故稱之為冒泡。 複雜度分析:平均情況與最壞情況均為 O(n^2), 使用了 temp 作為臨時交換變數,空間複雜度為 O(1)

堆排序

堆排序的是集合了插入排序的單陣列操作,又有歸併排序的時間複雜度,完美的結合了2者的優點。

直接插入排序

直接插入排序是一種最簡單的排序方法,它的基本操作是將一個記錄插入到已排好的有序的表中,從而得到一個新的、記錄數增1的有序表。當前元素的前面元素均為有序,要插入時,從當前元素的左邊開始往前找(從後往前找),比當前元素大的元素均往右移一個位置,最後把當前元素放在它應該呆的位置就行了。

歸併排序

歸併排序(Merge Sort)與快速排序思想類似:將待排序資料分成兩部分,繼續將兩個子部分進行遞迴的歸併排序;然後將已經有序的兩個子部分進行合併,最終完成排序。

其時間複雜度與快速排序均為O(nlogn),但是歸併排序除了遞迴呼叫間接使用了輔助空間棧,還需要額外的O(n)空間進行臨時儲存。從此角度歸併排序略遜於快速排序,但是歸併排序是一種穩定的排序演算法,快速排序則不然。

所謂穩定排序,表示對於具有相同值的多個元素,其間的先後順序保持不變。對於基本資料型別而言,一個排序演算法是否穩定,影響很小,但是對於結構體陣列,穩定排序就十分重要。

快速排序

通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

直接選擇排序

所謂選擇排序,就是每次找到未排序中最小的(最大的也行)元素的位置,找到後與該位置與未排序序列的第一個元素交換值,直到該序列成為有序序列。

初始狀態整個序列為無序序列,每次交換都使有序序列的長度加一,無序序列的起始位置後移一位。選擇排序的平均時間複雜度為O(n^2),且選擇排序相對不穩定。

希爾排序

Shellsort是最古老的排序演算法之一,該演算法以其發明者Donald L. Shell的名字命名。

在ShellSort排序演算法之前的演算法時間複雜度基本都是O(n2)O(n2),該演算法是突破這個時間複雜度的第一批演算法之一。

另外 Shellsort 是快速、易於理解和易於實現的。 然而,其複雜度分析有點複雜。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31137683/viewspace-2156998/,如需轉載,請註明出處,否則將追究法律責任。

相關文章