JAVA十大排序算法之插入排序詳解
插入排序
當我們在玩撲克牌的時候,總是在牌堆里面抽取最頂部的一張然后按順序在手中排列。
插入排序是指在待排序的元素中,假設(shè)前面n-1(其中n>=2)個數(shù)已經(jīng)是排好順序的,現(xiàn)將第n個數(shù)插到前面已經(jīng)排好的序列中,然后找到合適自己的位置,使得插入第n個數(shù)的這個序列也是排好順序的。
1.對于未排序數(shù)據(jù)(一般取數(shù)組的二個元素,把第一個元素當做有序數(shù)組),在已排序序列中從左往右掃描,找到相應(yīng)位置并插入。
2.為了給要插入的元素騰出空間,需要將插入位置之后的已排序元素在都向后移動一位。
代碼實現(xiàn)
對下面數(shù)組實現(xiàn)排序:{15, 51, 86, 70, 6, 42, 26, 61, 45, 81, 17, 1}
動圖演示
代碼實現(xiàn)
public class InsertionSort { public static final int[] ARRAY = {15, 51, 86, 70, 6, 42, 26, 61, 45, 81, 17, 1}; public static int[] sort(int[] array) { if (array.length == 0) { return array; } //待排序數(shù)據(jù),改數(shù)據(jù)之前的已被排序 int current; for (int i = 0; i < array.length - 1; i++) { //已被排序數(shù)據(jù)的索引 int index = i; current = array[index + 1]; //將當前元素后移一位 while (index >= 0 && current < array[index]) { array[index + 1] = array[index]; index--; } //插入 array[index + 1] = current; } return array; } public static void print(int[] array) { for (int i : array) { System.out.print(i + " "); } System.out.println(""); } public static void main(String[] args) { print(ARRAY); System.out.println("============================================"); print(sort(ARRAY)); } }
時間復(fù)雜度
在上面圖示中,第一趟循環(huán)比較一次,第二趟循環(huán)兩次,依次類推,則最后一趟比較n-1次:
1 + 2 + 3 +… + n-1 = n*(n-1)/2
也就是說,在最壞的情況下(逆序),比較的時間復(fù)雜度為O(n2)
在最優(yōu)的情況下,即while循壞總是假的,只需當前數(shù)跟前一個數(shù)比較一下就可以了,這時一共需要比較n-1次,時間復(fù)雜度為O(n)。
算法穩(wěn)定性
在比較的時候,過兩個數(shù)相等的話,不會進行移動,前后兩個數(shù)的次序不會發(fā)生改變,所以插入排序是穩(wěn)定的。
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
基于OpenID?Connect及Token?Relay實現(xiàn)Spring?Cloud?Gateway
這篇文章主要介紹了基于OpenID?Connect及Token?Relay實現(xiàn)Spring?Cloud?Gateway,Spring?Cloud?Gateway旨在提供一種簡單而有效的方式來路由到API,并為API提供跨領(lǐng)域的關(guān)注點,如:安全性、監(jiān)控/指標和彈性2022-06-06Java8 自定義CompletableFuture的原理解析
這篇文章主要介紹了Java8 自定義CompletableFuture的原理解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11JAVA中通過自定義注解進行數(shù)據(jù)驗證的方法
java 自定義注解驗證可自己添加所需要的注解,下面這篇文章主要給大家介紹了關(guān)于JAVA中通過自定義注解進行數(shù)據(jù)驗證的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Mybatis Mybatis-Plus傳入多個參數(shù)的處理方式
這篇文章主要介紹了Mybatis Mybatis-Plus傳入多個參數(shù)的處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05Spring websocket并發(fā)發(fā)送消息異常的解決
本文主要介紹了 Spring websocket并發(fā)發(fā)送消息異常的解決,當多個線程同時嘗試通過 WebSocket 會話發(fā)送消息時,會拋出異常,下面就來解決一下,感興趣的可以了解一下2023-09-09SpringBoot?實現(xiàn)動態(tài)添加定時任務(wù)功能
這篇文章主要介紹了SpringBoot?動態(tài)添加定時任務(wù),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02SpringCloud zookeeper作為注冊中心使用介紹
ZooKeeper由雅虎研究院開發(fā),是Google Chubby的開源實現(xiàn),后來托管到Apache,于2010年11月正式成為Apache的頂級項目。ZooKeeper是一個經(jīng)典的分布式數(shù)據(jù)一致性解決方案,致力于為分布式應(yīng)用提供一個高性能、高可用,且具有嚴格順序訪問控制能力的分布式協(xié)調(diào)服務(wù)2022-11-11