圖解Java經(jīng)典算法插入排序的原理與實(shí)現(xiàn)
一、算法介紹
插入排序,也稱為直接插入排序。插入排序是簡單排序中效率最好的一種,它也是學(xué)習(xí)其他高級排序的基礎(chǔ),比如希爾排序/快速排序,所以非常重要,而它相對于選擇排序的優(yōu)點(diǎn)就在于比較次數(shù)幾乎是少了一半。
二、算法思想
每次將待排序的元素插入到已排序的序列中,直至全部插入完成。
三、算法原理
- 把所有元素分為兩個(gè)序列,將第一待排序序列第一個(gè)元素看做一個(gè)有序序列,把第二個(gè)元素到最后一個(gè)元素當(dāng)成是未排序序列。
- 從未排序序列中的第一個(gè)元素開始,向已排序的序列中插入
- 倒序遍歷已排序序列,依次和待插入的元素比較,找到一個(gè)小于或等于待插入的元素,插入到該元素后面,其余元素向后移動(dòng)一位
四、動(dòng)圖演示
五、代碼實(shí)現(xiàn)
核心代碼
public class InsertionSort { // 插入排序 public static void sort(Comparable[] a){ for (int i = 1;i < a.length;i++){ for (int j = i;j > 0;j--){ //比較索引j處的值與索引j-1處的值,如果j-1索引處的值大,則交換數(shù)據(jù),反之,則找到了合適的位置,退出循環(huán) if (greater(a[j - 1],a[j])){ swap(a,j - 1,j); }else{ break; } } } } //比較 v 是否大于 w public static boolean greater(Comparable v,Comparable w){ return v.compareTo(w) > 0; } //數(shù)組元素交換位置 private static void swap(Comparable[] a,int i,int j){ Comparable temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } }
方法調(diào)用
public class InsertionSortTest { public static void main(String[] args) { Integer[] arr = {3,44,38,5,47,15,36,26,27}; InsertionSort.sort(arr); System.out.println(Arrays.toString(arr)); } } //排序前:{3,44,38,5,47,15,36,26,27} //排序后:{3,5,15,26,27,36,38,44,47}
六、算法分析
6.1 時(shí)間復(fù)雜度
當(dāng)待排序的 n 個(gè)元素是正序排列時(shí),是排序的最佳情況,只需要比較(n-1)次,時(shí)間復(fù)雜度是O(n);最壞的情況是該序列是反序排列,此時(shí)就需要比較n(n-1)/2次,時(shí)間復(fù)雜度為 O(n²)。
插入排序的平均時(shí)間復(fù)雜度為 O(n²)
6.2 空間復(fù)雜度
插入排序的空間復(fù)雜度為常數(shù)階O(1)
到此這篇關(guān)于圖解Java經(jīng)典算法插入排序的原理與實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java插入排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Spring分別實(shí)現(xiàn)定時(shí)任務(wù)方法
這篇文章主要為大家詳細(xì)介紹了Java與Spring設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法,定時(shí)任務(wù)的應(yīng)用場景十分廣泛,如定時(shí)清理文件、定時(shí)生成報(bào)表、定時(shí)數(shù)據(jù)同步備份等2022-07-07Java實(shí)現(xiàn)斷點(diǎn)續(xù)傳功能的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)網(wǎng)絡(luò)資源的斷點(diǎn)續(xù)傳功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下2022-10-10springboot2.0 配置時(shí)間格式化不生效問題的解決
這篇文章主要介紹了springboot2.0 配置時(shí)間格式化不生效問題的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09設(shè)計(jì)模式之模版方法模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了設(shè)計(jì)模式之模版方法模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析
這篇文章主要介紹了String實(shí)例化及static final修飾符實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Java 程序里transient關(guān)鍵字使用方法示例
這篇文章主要為大家介紹了Java 程序里transient關(guān)鍵字使用方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11