Java學習之7種排序演算法的完整例項程式碼
【本文轉自爪哇筆記 作者:Java 愛好者,原文連結:https://mp.weixin.qq.com/s/SJ_pJ9BnXFuMkIQqyRAvDA】
排序
排序是計算機內經常進行的一種操作,其目的是將一組“無序”的記錄序列調整為“有序”的記錄序列。分內部排序和外部排序,若整個排序過程不需要訪問外存便能完成,則稱此類排序問題為內部排序。反之,若參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成,則稱此類排序問題為外部排序。內部排序的過程是一個逐步擴大記錄的有序序列長度的過程。
概念
將雜亂無章的資料元素,透過一定的方法按關鍵字順序排列的過程叫做排序。
常見排序演算法
快速排序、希爾排序、堆排序、直接選擇排序不是穩定的排序演算法,而基數排序、氣泡排序、直接插入排序、折半插入排序、歸併排序是穩定的排序演算法。
分類
穩定排序:假設在待排序的檔案中,存在兩個或兩個以上的記錄具有相同的關鍵字,在 用某種排序法排序後,若這些相同關鍵字的元素的相對次序仍然不變,則這種排序方法 是穩定的。其中冒泡,插入,基數,歸併屬於穩定排序,選擇,快速,希爾,堆屬於不穩定排序。
就地排序:若排序演算法所需的輔助空間並不依賴於問題的規模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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- javascript希爾排序演算法程式碼例項JavaScript排序演算法
- javascript排序各種演算法例項程式碼JavaScript排序演算法
- js table表格排序程式碼例項JS排序
- 7種排序演算法排序演算法
- Java開發學習(四)----bean的三種例項化方式JavaBean
- jmeter學習指南之Beanshell 呼叫 java 程式碼的三種方式JMeterBeanJava
- js時間日期排序程式碼例項JS排序
- js陣列元素排序程式碼例項JS陣列排序
- 演算法學習之直接插入排序(java)演算法排序Java
- MapReduce程式設計例項之自定義排序程式設計排序
- 前端學習程式碼例項-JavaScript阻止事件冒泡前端JavaScript事件
- Python之粒子群演算法(含程式碼例項)Python演算法
- 雙連結串列插入排序例項程式碼排序
- 演算法學習之簡單排序演算法排序
- Java學習之程式碼優化Java優化
- 演算法學習之選擇排序和堆排序:演算法排序
- 前端學習程式碼例項-JavaScript 生成隨機數前端JavaScript隨機
- JavaScript實現的7種排序演算法JavaScript排序演算法
- js 陣列元素大小排序例項程式碼JS陣列排序
- js陣列由小到大排序程式碼例項JS陣列排序
- Java學習之程式碼最佳化Java
- PHP 四種基本排序演算法的程式碼實現PHP排序演算法
- checkbox全選和取消全選完整程式碼例項
- jQuery遍歷json格式資料完整程式碼例項jQueryJSON
- vue 原始碼學習 - 例項掛載Vue原始碼
- 用Go例項學習Protobuf編碼Go
- Java排序演算法之氣泡排序Java排序演算法
- 演算法導論學習之五:快速排序演算法排序
- js實現的json格式資料排序程式碼例項JSON排序
- 一遍記住Java常用的八種排序演算法與程式碼實現Java排序演算法
- 結合例項學習|字元編碼和解碼字元
- Java之執行緒同步完成售票例項的6種方式Java執行緒
- 幾種常用的排序程式碼排序
- 例項:學習XOR
- Makefile例項學習
- 前端學習程式碼例項-JavaScript 阻止擊超連結的跳轉前端JavaScript
- javascript的for in例項程式碼JavaScript
- JDK 7 新特性小結(包含例項程式碼)JDK