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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python之粒子群演算法(含程式碼例項)Python演算法
- Java開發學習(四)----bean的三種例項化方式JavaBean
- 7種排序演算法排序演算法
- jmeter學習指南之Beanshell 呼叫 java 程式碼的三種方式JMeterBeanJava
- 前端學習程式碼例項-JavaScript阻止事件冒泡前端JavaScript事件
- 前端學習程式碼例項-JavaScript 生成隨機數前端JavaScript隨機
- Java學習之程式碼優化Java優化
- 演算法學習之選擇排序和堆排序:演算法排序
- JavaScript實現的7種排序演算法JavaScript排序演算法
- vue 原始碼學習 - 例項掛載Vue原始碼
- JDK 7 新特性小結(包含例項程式碼)JDK
- Java學習之程式碼最佳化Java
- Java之執行緒同步完成售票例項的6種方式Java執行緒
- Spring 原始碼學習 - 單例bean的例項化過程Spring原始碼單例Bean
- 前端學習程式碼例項-JavaScript 阻止擊超連結的跳轉前端JavaScript
- 結合例項學習|字元編碼和解碼字元
- 一遍記住Java常用的八種排序演算法與程式碼實現Java排序演算法
- Makefile例項學習
- Java排序演算法之氣泡排序Java排序演算法
- 幾種常用的排序程式碼排序
- Python 3 學習筆記之類與例項Python筆記
- 涵蓋 14 大主題!最完整的 Python 學習例項集來了!Python
- Python實現簡單網頁圖片抓取完整程式碼例項Python網頁
- tail命令學習例項AI
- 【spring原始碼學習】Spring @PostConstruct和@PreDestroy例項Spring原始碼Struct
- dom操作程式碼例項
- css梯形程式碼例項CSS
- 【Java筆記】十分鐘搞定常用的八種排序演算法與程式碼實現Java筆記排序演算法
- 演算法導論學習--紅黑樹詳解之刪除(含完整紅黑樹程式碼)演算法
- 機器學習 - 似然函式:概念、應用與程式碼例項機器學習函式
- KafKa Java程式設計例項KafkaJava程式設計
- Java的幾種建立例項方法的效能對比Java
- Java常見排序演算法之插入排序Java排序演算法
- PHP 完整表單例項PHP單例
- Java基礎系列-單例的7種寫法Java單例
- JPG學習筆記2(附完整程式碼)筆記
- JPG學習筆記1(附完整程式碼)筆記
- JPG學習筆記3(附完整程式碼)筆記