算法系列之直接插入排序

什么是排序

這里是排序算法的第一篇笑跛,那么熬甚,我們先來回顧一下什么是排序逢渔?

顧名思義,排序就是把由一系列元素組成的列表按指定的規(guī)則排列乡括。

什么是插入排序肃廓?為什么要使用?

簡單的說诲泌,插入排序就是把無序的元素插入到有序的元素當(dāng)中盲赊。

插入排序的過程

關(guān)于這個(gè),《算法導(dǎo)論》中舉了一個(gè)特為形象的例子敷扫,插入排序就如同你在打撲克時(shí)摸牌一樣哀蘑,手里的牌是有序的,而你剛摸得牌是是隨機(jī)的葵第,需要你插入到已經(jīng)排好序的撲克牌中绘迁,這就是插入排序。

YouTube有一個(gè)很好的視頻:https://www.youtube.com/watch?v=DFG-XuyPYUQ

偽代碼

for i ← 1 to length(A) - 1   
    j ← i   
    while j > 0 and A[j-1] > A[j]    
        swap A[j] and A[j-1]    
        j ← j - 1    
    end while    
end for    

C語言的實(shí)現(xiàn)

//插入排序
void insertSort(RecordList *L)
{
    printf("開始插入排序...\n");
    
    //1羹幸、初始時(shí)刻脊髓,第一個(gè)元素本來假設(shè)是有序的
    //2、從第二個(gè)元素開始, 依次循環(huán)插入
    //3栅受、可以將元素看成兩部分,已經(jīng)排好序的和尚未排序的恭朗,每次從尚未排好序的元素中取出元素和已經(jīng)排好序的比較屏镊,插入到指定位置
    for (int i = 1; i < L->length; i++) {
        int j = i;
        while (j > 0 && (L->record[j-1].key) > (L->record[j].key)) {
            int temp;
            temp = L->record[j-1].key;
            L->record[j-1].key = L->record[j].key;
            L->record[j].key = temp;
            --j;
        }
    }
    
    printf("排序完成\n");
}

運(yùn)行結(jié)果:

正在插入數(shù)據(jù)7,其他信息0
插入后當(dāng)前長度:1
正在插入數(shù)據(jù)9痰腮,其他信息1
插入后當(dāng)前長度:2
正在插入數(shù)據(jù)3而芥,其他信息2
插入后當(dāng)前長度:3
正在插入數(shù)據(jù)8,其他信息3
插入后當(dāng)前長度:4
正在插入數(shù)據(jù)0膀值,其他信息4
插入后當(dāng)前長度:5
正在插入數(shù)據(jù)2棍丐,其他信息5
插入后當(dāng)前長度:6
正在插入數(shù)據(jù)4误辑,其他信息6
插入后當(dāng)前長度:7
正在插入數(shù)據(jù)8,其他信息7
插入后當(dāng)前長度:8
正在插入數(shù)據(jù)3歌逢,其他信息8
插入后當(dāng)前長度:9
正在插入數(shù)據(jù)9巾钉,其他信息9
插入后當(dāng)前長度:10
原始記錄表:
關(guān)鍵字     原始位置
7       0
9       1
3       2
8       3
0       4
2       5
4       6
8       7
3       8
9       9
開始插入排序...
排序完成
直接插入排序后的記錄表:
關(guān)鍵字     原始位置
0       0
2       1
3       2
3       3
4       4
7       5
8       6
8       7
9       8
9       9

詳見我的Github:( https://github.com/terwer/data-structure/tree/master/sort/InsertionSort ),可以直接下載后用XCode打開運(yùn)行秘案。

時(shí)間復(fù)雜度分析

可以看出砰苍,一次循環(huán)就完成了排序,因此插入排序的時(shí)間復(fù)雜度為O(1)

插入排序的優(yōu)缺點(diǎn)總結(jié)

優(yōu)點(diǎn):

1阱高、插入排序?qū)τ谛?shù)據(jù)集合很有效赚导,這個(gè)很好理解,因?yàn)樾枰闅vlength-1次赤惊,所以數(shù)據(jù)量太大肯定不太高效吼旧。

2、比大多數(shù)O((n^2))的算法(比如冒泡排序未舟、選擇排序)要高效圈暗。

3、自適應(yīng)排序处面,對于若干個(gè)已經(jīng)排好序并且不大于k的集合厂置,它的時(shí)間復(fù)雜度時(shí)是O(nk)

4、穩(wěn)定魂角。插入排序是穩(wěn)定的昵济,排序之后不會改變元素原來的相對順序。

5野揪、原地排序访忿。插入排序的時(shí)間復(fù)雜度為O(1)

6斯稳、他是在線算法海铆。關(guān)于在線算法,StackOverflow有一個(gè)很好的解答:( http://stackoverflow.com/questions/11496013/what-is-the-difference-between-an-on-line-and-off-line-algorithm )挣惰。

原文來自我的博客:http://www.terwer.com/direct-insertion-sort.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卧斟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子憎茂,更是在濱河造成了極大的恐慌珍语,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竖幔,死亡現(xiàn)場離奇詭異板乙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拳氢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門募逞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛋铆,“玉大人,你說我怎么就攤上這事放接〈汤玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵透乾,是天一觀的道長洪燥。 經(jīng)常有香客問我,道長乳乌,這世上最難降的妖魔是什么捧韵? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮汉操,結(jié)果婚禮上再来,老公的妹妹穿的比我還像新娘。我一直安慰自己磷瘤,他們只是感情好芒篷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著采缚,像睡著了一般针炉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扳抽,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天篡帕,我揣著相機(jī)與錄音,去河邊找鬼贸呢。 笑死镰烧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的楞陷。 我是一名探鬼主播怔鳖,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼固蛾!你這毒婦竟也來了结执?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤艾凯,失蹤者是張志新(化名)和其女友劉穎昌犹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體览芳,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年鸿竖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沧竟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铸敏。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悟泵,靈堂內(nèi)的尸體忽然破棺而出杈笔,到底是詐尸還是另有隱情,我是刑警寧澤糕非,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布蒙具,位于F島的核電站,受9級特大地震影響朽肥,放射性物質(zhì)發(fā)生泄漏禁筏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一衡招、第九天 我趴在偏房一處隱蔽的房頂上張望篱昔。 院中可真熱鬧,春花似錦始腾、人聲如沸州刽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穗椅。三九已至,卻和暖如春奶栖,著一層夾襖步出監(jiān)牢的瞬間匹表,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工驼抹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桑孩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓框冀,卻偏偏與公主長得像流椒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子明也,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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

  • 概述排序有內(nèi)部排序和外部排序宣虾,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大温数,一次不能容納全部的...
    Luc_閱讀 2,270評論 0 35
  • 概述:排序有內(nèi)部排序和外部排序绣硝,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大撑刺,一次不能容納全部...
    每天刷兩次牙閱讀 3,730評論 0 15
  • 概述 排序有內(nèi)部排序和外部排序鹉胖,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,183評論 0 52
  • 前言 查找和排序算法是算法的入門知識甫菠,其經(jīng)典思想可以用于很多算法當(dāng)中挠铲。因?yàn)槠鋵?shí)現(xiàn)代碼較短,應(yīng)用較常見寂诱。所以在面試中...
    寶塔山上的貓閱讀 1,089評論 1 21
  • I haven't written a single poem in months. I have lived h...
    夭夭如也_3y閱讀 286評論 0 0