java 實現(xiàn)排序算法之「插入排序」

java 實現(xiàn)排序算法系列

這是 Java 實現(xiàn)排序算法的第三篇文章——插入排序算法删铃。插入排序可以說成是「一類」簡單的排序算法,因為插入排序可以有變種火欧,比如二分查找插入排序算法,本文講述的是直接插入排序。

如文中出現(xiàn)錯誤响鹃,請在公眾號「ikook」聊天窗口留言,十分感謝案训。

插入排序

插入排序「Insertion Sort」是一種簡單直觀的排序算法买置。它的工作原理是通過構(gòu)建有序序列,對于未排序數(shù)據(jù)强霎,在已排序序列中從后向前掃描忿项,找到相應位置并插入。

來看一下插入排序算法的思路:

  • 將需排序的數(shù)據(jù)分成已排序和未排序兩部分城舞,從第一個元素開始轩触,并將該元素看做已排序。

  • 取得下一個元素家夺,即第二個元素脱柱,在已排序的序列中由后向前掃描,找出合適的位置將該元素插入拉馋。

  • 重復上述步驟褐捻,直到最后一個元素被插入到已排序序列中。

  • 排序完成椅邓。

使用插入排序為一列數(shù)字進行排序的過程示意圖(來自維基百科):

<center>



</center>

插入排序算法示意圖(來自維基百科):

<center>



</center>

代碼實現(xiàn)

從上面可以看到柠逞,算法思路非常簡單,但是代碼就不那么簡單易寫了景馁。算法本身是沒有問題的板壮,之所以不易寫我覺得是由于編程語言的問題。這里我們使用 Java 來實現(xiàn)合住,那就拿 Java 來講绰精。

在上述思路中我們可以提出幾個問題撒璧,先來看下。首先笨使,我們該如何判斷合適的位置卿樱?邊界條件該怎么處理?在數(shù)組中插入元素硫椰,必然會移動數(shù)據(jù)繁调,如何控制數(shù)據(jù)的移動?

為了解決這些問題靶草,我們可以在算法思路的第二步做手腳蹄胰,將第二步細化。我們不在已排序的序列起始位置開始比較奕翔,從已排序序列的尾部開始逆序比較裕寨,只要比待插入的數(shù)據(jù)大,那就向后移動派继,直到不大于該數(shù)據(jù)宾袜,此時空出來的位置就放入待插入數(shù)據(jù)。

上代碼:

private static void insertionSort(int[] arr){
      for (int i=1; i<arr.length; i++){
          int value = arr[i];
          int position=i;
          while (position>0 && arr[position-1]>value){
              arr[position] = arr[position-1];
              position--;
          }
          arr[position] = value;
      }
}

如果在代碼的理解上遇到困難驾窟,可以利用 IDE 的調(diào)試功能來學習试和。如下圖(IntelliJ IDEA):

<center>



</center>

算法復雜度

從上述內(nèi)容容易看出,無論輸入的數(shù)據(jù)怎樣纫普,插入排序算法總會進行 n-1 次排序阅悍。

由于每個元素插入點的不確定性,該算法復雜度并不是一定的昨稼。假設我們要將 n 個元素的序列升序排序节视,這時存在最好情況和最壞情況。

最好情況就是假栓,序列已經(jīng)是升序排列了(即數(shù)據(jù)本身的順序和我們需要的順序相同)寻行。此時,需要進行的比較操作需(n-1)次即可匾荆,時間復雜度為 O(n)拌蜘。

最壞情況很顯然,序列為逆序排列時牙丽,即降序排序時為最壞简卧。此時,需要進行的比較共有 1/2n(n-1) 次烤芦,時間復雜度為 O(n^2)举娩。

平均來說,插入排序算法復雜度為 O(n^2)。插入排序的賦值操作是比較操作的次數(shù)加上(n-1)次铜涉。

空間復雜度智玻,插入排序所有的數(shù)據(jù)移動均在內(nèi)部進行,唯一的開銷是我們使用了一個臨時變量芙代,則空間復雜度為 O(1)吊奢。

插入排序算法分析

算法穩(wěn)定性:
拿本文中的例子來講,只需要找到需插入元素的位置即可纹烹,并不需要交換页滚,則直接插入排序是穩(wěn)定排序算法。

適用場景:
從算法復雜度可以看出滔韵,該排序算法不適合數(shù)據(jù)較大的情況,數(shù)量級小于千時掌实,插入排序是一個不錯的選擇陪蜻。在 STL 的 sort 算法和 stdlib 的 qsort 算法中,都將插入排序作為快速排序的補充贱鼻,用于少量數(shù)據(jù)的排序宴卖。

其他

關于插入排序算法的變種大家有興趣的自己 Google 一下,本文只講述了基本的直接插入排序邻悬。插入排序的變種大概有這幾種:二分查找插入排序症昏、2 - 路插入排序、表插入排序父丰。二分查找插入排序有的文獻叫做折半插入排序肝谭,2 - 路插入排序和表插入排序可以參考《數(shù)據(jù)結(jié)構(gòu)》(嚴蔚敏、吳偉民著)一書蛾扇。

完攘烛。

相關閱讀:
Java 實現(xiàn)「冒泡排序」
Java 實現(xiàn)「選擇排序」

PS:如果你覺得本文對你有一點幫助,點贊镀首、轉(zhuǎn)發(fā)坟漱,不勝感激。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末更哄,一起剝皮案震驚了整個濱河市芋齿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌成翩,老刑警劉巖觅捆,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麻敌,居然都是意外死亡惠拭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來职辅,“玉大人棒呛,你說我怎么就攤上這事∮蛐” “怎么了簇秒?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長秀鞭。 經(jīng)常有香客問我趋观,道長,這世上最難降的妖魔是什么锋边? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任皱坛,我火速辦了婚禮,結(jié)果婚禮上豆巨,老公的妹妹穿的比我還像新娘剩辟。我一直安慰自己,他們只是感情好往扔,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布贩猎。 她就那樣靜靜地躺著,像睡著了一般萍膛。 火紅的嫁衣襯著肌膚如雪吭服。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天蝗罗,我揣著相機與錄音艇棕,去河邊找鬼。 笑死串塑,一個胖子當著我的面吹牛欠肾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拟赊,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼刺桃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吸祟?” 一聲冷哼從身側(cè)響起瑟慈,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屋匕,沒想到半個月后葛碧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡过吻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年进泼,在試婚紗的時候發(fā)現(xiàn)自己被綠了蔗衡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡乳绕,死狀恐怖绞惦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洋措,我是刑警寧澤济蝉,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站菠发,受9級特大地震影響王滤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滓鸠,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一雁乡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糜俗,春花似錦踱稍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽渔工。三九已至锌钮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間引矩,已是汗流浹背梁丘。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旺韭,地道東北人氛谜。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像区端,于是被迫代替她去往敵國和親值漫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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

  • 概述排序有內(nèi)部排序和外部排序织盼,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序杨何,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的...
    Luc_閱讀 2,270評論 0 35
  • 排序的基本概念 在計算機程序開發(fā)過程中沥邻,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個關鍵字進行排序危虱,排序完成的序列可用于快...
    Jack921閱讀 1,428評論 1 4
  • 該系列文章主要是記錄下自己暑假這段時間的學習筆記,暑期也在實習唐全,抽空學了很多埃跷,每個方面的知識我都會另起一篇博客去記...
    Yanci516閱讀 12,212評論 6 19
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大弥雹,一次不能容納全部...
    蟻前閱讀 5,183評論 0 52
  • 這周話題是有關貴人的垃帅,于是很多朋友把注意力放到了“如何遇到貴人”上。 還記得這句話嗎缅糟? 自己首先是個貴人挺智,才能遇到...
    pws019閱讀 175評論 0 0