直接插入排序

直接插入排序:

什么是直接插入排序?

每一趟將一個(gè)待排序的記錄,按照其關(guān)鍵字的大小插入到有序隊(duì)列的合適位置里,直到全部插入完成。

通俗解釋一波:

打牌為例:

先拿一張5在手里,

再摸到一張4,比5小,插到5前面,

摸到一張6,嗯,比5大,插到5后面,

摸到一張8,比6大,插到6后面,

。。。

嗯,等你最后一張牌插完,你發(fā)現(xiàn)所有牌都有順序了(這個(gè)只對(duì)按順序插牌的同學(xué)有效~~~~)

圖片解釋一波:


代碼基本思路:

待排序記錄 R1,R2,… ,Rn–1, Rn

第一步:R1

第二步:(R1 ), R2

第三步:(R1 , R2), R3

……

第 j 步:(R1,R2,… ,Rj–1), Rj

……

第 n 步: (R1,R2,… ,Rn–1), Rn.

例:j=5

原有序表中關(guān)鍵詞比Rj大的記錄數(shù):dj

比較次數(shù):dj+1 移動(dòng)次數(shù): dj+2

Java代碼實(shí)現(xiàn):

public class SortTest {

public static void main(String[] args) {

// TODO Auto-generated method stub

int[] sort = { 4, 5, 6, 7, 9 };

insertSort(sort);

}

public static void insertSort(int[] list) {

// 第1個(gè)數(shù)肯定是有序的,從第2個(gè)數(shù)開始遍歷,依次插入有序序列

for (int i = 1; i < list.length; i++) {

int j = 0;

int temp = list[i]; // 取出第i個(gè)數(shù),和前i-1個(gè)數(shù)比較后,插入合適位置

// 因?yàn)榍癷-1個(gè)數(shù)都是從小到大的有序序列,所以只要當(dāng)前比較的數(shù)(list[j])比temp大,就把這個(gè)數(shù)后移一位

for (j = i - 1; j >= 0 && temp < list[j]; j--) {

list[j + 1] = list[j];

}

list[j + 1] = temp;

}

//處處排序后的結(jié)果

for (int i : list) {

System.out.println(i);

}

}

}

輸入序列:

sort = { 4, 3, 6, 1, 9 };

輸出結(jié)果:

1

3

4

6

9

算法性能分析:


時(shí)間復(fù)雜度:

當(dāng)數(shù)據(jù)正序時(shí),執(zhí)行效率最好,每次插入都不用移動(dòng)前面的元素,時(shí)間復(fù)雜度為O(N)

當(dāng)數(shù)據(jù)反序時(shí),執(zhí)行效率最差,每次插入都要前面的元素后移,時(shí)間復(fù)雜度為O(N2)。

所以,數(shù)據(jù)越接近正序,直接插入排序的算法性能越好。

空間復(fù)雜度:

由直接插入排序算法可知,我們在排序過程中,需要一個(gè)臨時(shí)變量存儲(chǔ)要插入的值,所以空間復(fù)雜度為1

算法穩(wěn)定性:

直接插入排序的過程中,不需要改變相等數(shù)值元素的位置,所以它是穩(wěn)定的算法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容