探析原理思路_直接插入排序(Java)

直接插入排序


前言:在博客寫這些文章的目的用于記錄所學(xué)踪央,怕以后忘了来涨,如果哪里寫的不對歡迎指正屈梁,謝謝Q渭睢!

學(xué)習(xí)目標(biāo):掌握直接插入排序算法的原理和思想

一玉锌、前提知識(shí)

??排序算法概念名挥、時(shí)間復(fù)雜度≈魇兀可前往此網(wǎng)址 排序算法學(xué)習(xí)01_算法基礎(chǔ)介紹閱讀

二禀倔、直接插入排序介紹

??直接插入排序是屬于插入排序中的一種簡單的排序,它通過抽象兩個(gè)序列参淫,一個(gè)為正在排序的序列稱之為有序序列蹋艺,一個(gè)為未排序序列。
??每次從未排序序列中取值放入有序序列黄刚,來完成排序捎谨,就像抽取撲克牌一樣

三、直接插入排序工作原理

??構(gòu)建一個(gè)有序序列,接著取一個(gè)未排序序列中第一個(gè)元素涛救,然后依次從后往前掃描有序序列中的符合條件的值進(jìn)行比較畏邢,最終找到指定位置插入,成為一個(gè)有序序列中的值检吆。然后繼續(xù)判斷未排序序列中的值

?
在這里插入圖片描述

四舒萎、直接插入排序設(shè)計(jì)思路

1.根據(jù)工作原理要構(gòu)建一個(gè)有序序列

  • 所說構(gòu)建,并不是真的再創(chuàng)建一個(gè)序列去接收蹭沛,而是找已排序好的序列范圍臂寝,然后剩余序列就可以慢慢進(jìn)去比較。那我們就要先給出一個(gè)有序序列摊灭,則選擇數(shù)列的第一位當(dāng)成一個(gè)有序序列

2.未排序序列中的元素咆贬,進(jìn)入有序序列中的過程

  • 我們知道首先要保存待進(jìn)入元素,然后從后到前掃描帚呼,到達(dá)目標(biāo)位置執(zhí)行插入掏缎。但是你要知道我們此時(shí)只有一個(gè)數(shù)組,如何往有序列表a[0] 和 a[1]之中插入元素呢煤杀?

  • 假設(shè)上面圖片眷蜈,正是我們要排序的數(shù)列,要讓2插入1和3之間沈自,怎么做酌儒?可以這樣實(shí)現(xiàn):

    • 每次掃描元素,發(fā)現(xiàn)符合條件枯途,則讓該有序數(shù)列往后移今豆。
    • 比如本來有序數(shù)列【排序?yàn)檫f增】為: { 1,3柔袁,5 }呆躲,待插入元素為2,從后往前遍歷有序序列捶索,看到元素5時(shí)符合條件插掂,那么讓元素5往后移,此時(shí)元素5將覆蓋元素2腥例,也就是在數(shù)組中a[3] = a[2]辅甥。然后原本a[2]這個(gè)位置就可以決定是否插入,進(jìn)行判斷
    在這里插入圖片描述

五燎竖、直接插入排序算法代碼實(shí)現(xiàn)

要求對以下這個(gè)數(shù)列進(jìn)行遞增排序:{3璃弄,2,5构回,1夏块,7疏咐,9,8}

package com.migu.sortingAlgorithm;

import java.util.Arrays;

/**
 * 直接插入排序
 */
public class DirectInsertionSort {
    public static void main(String[] args) {
        int a[] = {3,2,5,1,7,9,8};
        // 數(shù)列第一位已為有序序列脐供,則從下一位開始判斷是否選擇插入
        for(int i = 1;i < a.length;i++){
            int insertVal = a[i];  // 保存待插入的值【根據(jù)設(shè)計(jì)思路第一點(diǎn)】
            
            int insertIndex = i-1; // 從有序序列最后一位開始判斷浑塞,也就是待插入值的前一位索引,該索引往前肯定都是已排序好的【根據(jù)設(shè)計(jì)思路第一點(diǎn)】
            // 由于要求遞增政己,那么就待插入元素小于有序列表中的值時(shí)酌壕,有序列表值就執(zhí)行后移動(dòng)作。然后需要注意數(shù)組索引不能越界
            while (insertIndex >=0 && insertVal < a[insertIndex]){ 
                // 【根據(jù)設(shè)計(jì)思路第二點(diǎn)】
                a[insertIndex+1] = a[insertIndex];  // 此舉將覆蓋待插入的值歇由,但我們已經(jīng)提前保存了
                insertIndex--;  // 從后往前遍歷
            }
           // while循結(jié)束inertIndex是還會(huì)再--的卵牍,所以對其+1。然后保存待插入的值
            a[insertIndex+1] = insertVal;
        }
        System.out.println(Arrays.toString(a)); // 調(diào)用工具類輸出
    }
}
輸出:<img src="E:\哈哈\md\數(shù)據(jù)結(jié)構(gòu)和算法\zjcr_04.png" alt="zjcr_04" style="zoom: 67%;" />

六沦泌、時(shí)間復(fù)雜度分析

??討論一個(gè)算法的時(shí)間復(fù)雜度糊昙,一般都是看最壞的情況: 簡單選擇排序算法的時(shí)間復(fù)雜度為O(n^2)。更多特殊情況請參考其他書籍或博客

七赦肃、總結(jié)

??直接插入排序算法,不像冒泡排序簡單選擇排序公浪,每完成一次排序都會(huì)在數(shù)列某個(gè)位置最終確定元素他宛。

??直接插入排序不需要重復(fù)走訪所有元素,每進(jìn)行一次排序只在有序序列中走訪并對數(shù)組上元素進(jìn)行移動(dòng)欠气。性能比冒泡排序好比簡單選擇排序差點(diǎn)
??缺點(diǎn)就是比如要做遞增時(shí)厅各,待添加元素是在有序序列中最小的,那么就要在數(shù)組上移動(dòng)大量數(shù)據(jù)预柒,極耗時(shí)間队塘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宜鸯,隨后出現(xiàn)的幾起案子憔古,更是在濱河造成了極大的恐慌,老刑警劉巖淋袖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸿市,死亡現(xiàn)場離奇詭異,居然都是意外死亡即碗,警方通過查閱死者的電腦和手機(jī)焰情,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剥懒,“玉大人内舟,你說我怎么就攤上這事〕蹰伲” “怎么了验游?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵充岛,是天一觀的道長。 經(jīng)常有香客問我批狱,道長裸准,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任赔硫,我火速辦了婚禮炒俱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爪膊。我一直安慰自己权悟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布推盛。 她就那樣靜靜地躺著峦阁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耘成。 梳的紋絲不亂的頭發(fā)上榔昔,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音瘪菌,去河邊找鬼撒会。 笑死,一個(gè)胖子當(dāng)著我的面吹牛师妙,可吹牛的內(nèi)容都是我干的诵肛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼默穴,長吁一口氣:“原來是場噩夢啊……” “哼怔檩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蓄诽,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤薛训,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后仑氛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體许蓖,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年调衰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了膊爪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嚎莉,死狀恐怖米酬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趋箩,我是刑警寧澤赃额,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布加派,位于F島的核電站,受9級(jí)特大地震影響跳芳,放射性物質(zhì)發(fā)生泄漏芍锦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一飞盆、第九天 我趴在偏房一處隱蔽的房頂上張望娄琉。 院中可真熱鬧,春花似錦吓歇、人聲如沸孽水。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽女气。三九已至,卻和暖如春测柠,著一層夾襖步出監(jiān)牢的瞬間炼鞠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工轰胁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谒主,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓软吐,卻偏偏與公主長得像瘩将,于是被迫代替她去往敵國和親吟税。 傳聞我的和親對象是個(gè)殘疾皇子凹耙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一、直接插入排序 原理 直接插入排序是一種最基本的插入排序方法肠仪,能夠?qū)⒌趇個(gè)記錄插入到前面i-1個(gè)已排好序的記錄中...
    GoFuncChan閱讀 875評(píng)論 0 1
  • 直接插入排序是一種最簡單的排序算法肖抱,在后續(xù)我會(huì)繼續(xù)發(fā)布其他的簡單排序;直接插入的算法基本思想是:僅有一個(gè)元素的序列...
    牧歌_東閱讀 4,836評(píng)論 0 0
  • 直接插入排序异旧,是算法里老生常談的經(jīng)典意述,這里直接先上一段原始版的直接插入排序代碼,然后順著代碼理思路吮蛹,最后再來一段優(yōu)...
    Sunflow007閱讀 309評(píng)論 0 0
  • 介紹一下四種Java的經(jīng)典算法,這四種算法是非趁颗瘢基礎(chǔ)的算法瓣戚,學(xué)算法對我們深入理解程序有很大幫助端圈。 選擇排序 冒泡排...
    Jason_M_Ho閱讀 665評(píng)論 1 2
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)子库、注意力舱权、語言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析仑嗅,社會(huì)...
    Jenaral閱讀 5,721評(píng)論 0 5