JAVA十大排序算法之插入排序詳解
插入排序
當(dāng)我們?cè)谕鎿淇伺频臅r(shí)候,總是在牌堆里面抽取最頂部的一張然后按順序在手中排列。
插入排序是指在待排序的元素中,假設(shè)前面n-1(其中n>=2)個(gè)數(shù)已經(jīng)是排好順序的,現(xiàn)將第n個(gè)數(shù)插到前面已經(jīng)排好的序列中,然后找到合適自己的位置,使得插入第n個(gè)數(shù)的這個(gè)序列也是排好順序的。
1.對(duì)于未排序數(shù)據(jù)(一般取數(shù)組的二個(gè)元素,把第一個(gè)元素當(dāng)做有序數(shù)組),在已排序序列中從左往右掃描,找到相應(yīng)位置并插入。
2.為了給要插入的元素騰出空間,需要將插入位置之后的已排序元素在都向后移動(dòng)一位。

代碼實(shí)現(xiàn)
對(duì)下面數(shù)組實(shí)現(xiàn)排序:{15, 51, 86, 70, 6, 42, 26, 61, 45, 81, 17, 1}
動(dòng)圖演示

代碼實(shí)現(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];
//將當(dāng)前元素后移一位
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));
}
}
時(shí)間復(fù)雜度
在上面圖示中,第一趟循環(huán)比較一次,第二趟循環(huán)兩次,依次類推,則最后一趟比較n-1次:
1 + 2 + 3 +… + n-1 = n*(n-1)/2
也就是說,在最壞的情況下(逆序),比較的時(shí)間復(fù)雜度為O(n2)
在最優(yōu)的情況下,即while循壞總是假的,只需當(dāng)前數(shù)跟前一個(gè)數(shù)比較一下就可以了,這時(shí)一共需要比較n-1次,時(shí)間復(fù)雜度為O(n)。
算法穩(wěn)定性
在比較的時(shí)候,過兩個(gè)數(shù)相等的話,不會(huì)進(jìn)行移動(dòng),前后兩個(gè)數(shù)的次序不會(huì)發(fā)生改變,所以插入排序是穩(wěn)定的。
總結(jié)
本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
OAuth2生成token代碼備忘實(shí)現(xiàn)過程示例
這篇文章主要為大家介紹了OAuth2生成token代碼備忘實(shí)現(xiàn)過程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Spring中的@Value和@PropertySource注解詳解
這篇文章主要介紹了Spring中的@Value和@PropertySource注解詳解,@PropertySource:讀取外部配置文件中的key-value保存到運(yùn)行的環(huán)境變量中,本文提供了部分實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-11-11
SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解
這篇文章主要介紹了SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解,定時(shí)任務(wù)是企業(yè)級(jí)開發(fā)中最常見的功能之一,如定時(shí)統(tǒng)計(jì)訂單數(shù)、數(shù)據(jù)庫(kù)備份、定時(shí)發(fā)送短信和郵件、定時(shí)統(tǒng)計(jì)博客訪客等,簡(jiǎn)單的定時(shí)任務(wù)可以直接通過Spring中的@Scheduled注解來實(shí)現(xiàn),需要的朋友可以參考下2024-01-01
基于Feign傳輸對(duì)象無法接收參數(shù)的問題
這篇文章主要介紹了基于Feign傳輸對(duì)象無法接收參數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
在Java中實(shí)現(xiàn)二叉搜索樹的全過程記錄
二叉樹包含了根節(jié)點(diǎn),孩子節(jié)點(diǎn),葉節(jié)點(diǎn),每一個(gè)二叉樹只有一個(gè)根節(jié)點(diǎn),每一個(gè)結(jié)點(diǎn)最多只有兩個(gè)節(jié)點(diǎn),左子樹的鍵值小于根的鍵值,右子樹的鍵值大于根的鍵值,下面這篇文章主要給大家介紹了關(guān)于如何在Java中實(shí)現(xiàn)二叉搜索樹的相關(guān)資料,需要的朋友可以參考下2022-03-03
Service層異常拋到Controller層處理還是直接處理問題分析
這篇文章主要為大家介紹了Service層異常拋到Controller層處理還是直接處理的問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

