插入排序算法

插入排序(Insertion Sort)算法通過對未排序的數據執(zhí)行逐個插入至合適的位置而完成排序工作舀武。插入排序算法的思路比較簡單,應用比較多捻撑。

插入排序算法

插入排序算法通過比較和插入來實現排序乎折,其排序流程如下:

⑴首先對數組的前兩個數據進行從小到大的排序蒸其。

⑵接著將第3個數據與排好序的兩個數據比較,將第3個數據插入合適的位置碍彭。

⑶然后晤硕,將第4個數據插入已排好序的前3個數據中。

⑷不斷重復上述過程庇忌,直到把最后一個數據插入合適的位置舞箍。最后,便完成了對原始數組從小到大的排序皆疹。

為了更好地理解插入排序算法的執(zhí)行過程疏橄,下面舉一個實際數據的例子來一步一步地執(zhí)行插入排序算法。5個整型數據118略就、101捎迫、105、127表牢、112是一組無須的數據窄绒。對其執(zhí)行插入排序過程,如圖1所示崔兴。

插入排序算法的執(zhí)行步驟如下:

⑴第1次排序彰导,首先對數組的前兩個數據118和101排序蛔翅,由于118大于101,因此將其交換位谋。此時的排序后的數據為101山析、118、105倔幼、127盖腿、112。

⑵第2次排序损同,對于第3個數據105翩腐,其大于101,而小于118膏燃,將其插入它們之間茂卦。此時排序后的數據為101、105组哩、118等龙、127、112伶贰。

⑶第3次排序蛛砰,對于第4個數據127,其大于118黍衙,將其插入118之后泥畅。此時排序后的數據為101、105琅翻、118位仁、127、112方椎。

⑷第4次排序聂抢,對于第5個數據112,其大于105棠众,小于118琳疏,將其插入105和118之間。此時排序后的數據為101闸拿、105轿亮、112、118胸墙、127我注。

從上面的例子可以非常直觀地了解到插入排序算法的執(zhí)行過程。插入排序算法在對n個數據進行排序時迟隅,無論原數據有無順序但骨,都需要進行n-1步的中間排序励七。這種排序方法思路簡單直觀,在數據已有一定順序的情況下奔缠,排序效率較好掠抬。但如果數據無規(guī)則,則需要移動大量的數據校哎,其排序效率也不高两波。

插入排序算法的示例代碼如下:

void insertionSort(int[] a) {

int i, j, t, h;

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

t = a[i];

j = i - 1;

while (j >= 0 && t < a[j]) {

a[j + 1] = a[j];

j--;

}

a[j + 1] = t;

System.out.print("第" + i + "步排序結果:");

for (h = 0; h < a.length; h++) {

System.out.print(" " + a[h]);

}

System.out.print("\n");

}

}

在上述代碼中,輸入參數a一般為一個數組的首地址闷哆,待排序的原數據便保存在數組a中腰奋。

在程序中,首先將需要插入的元素保存到變量t中抱怔。變量j表示需要插入的位置劣坊,一般就是插入數組元素的序號。設置變量j的值為i-1屈留,表示準備將當前位置(序號為i)的數插入序號為i-1(即前一個元素)的 位置局冰。

接著,算法程序通過while循環(huán)來進行判斷灌危,如果序號為j元素的數據大于變量t(需要插入的數據)康二,則將序號為j的元素向后移,同時變量j減1勇蝙,以判斷前一個數據是否還需要向后移沫勿。通過該while循環(huán)來找到一個元素的值比t小,該元素的序號為j浅蚪。然后,將序號為j的下一個元素進行數據插入操作烫罩。

插入排序算法實例

學習了前面的插入排序算法的基本思想和算法之后惜傲,下面通過一個完整的例子來說明插入排序法在整型數組排序中的應用,程序示例如下:

【程序】

public class Insertion_Sort {

static final int SIZE = 10;

static void insertionSort(int[] a) {

int i, j, t, h;

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

t = a[i];

j = i - 1;

while (j >= 0 && t < a[j]) {

a[j + 1] = a[j];

j--;

}

a[j + 1] = t;

System.out.print("第" + i + "步排序結果:");

for (h = 0; h < a.length; h++) {

System.out.print(" " + a[h]);

}

System.out.print("\n");

}

}

public static void main(String[] args) {

int[] shuzu = new int[SIZE];

int i;

for (i = 0; i < SIZE; i++) {

shuzu[i] = (int) (100 + Math.random() * (100 + 1));

}

System.out.print("排序前的數組為: \n");

for (i = 0; i < SIZE; i++) {

System.out.print(shuzu[i] + " ");

}

System.out.print("\n");

insertionSort(shuzu);

System.out.print("排序后的數組為: \n");

for (i = 0; i < SIZE; i++) {

System.out.print(shuzu[i] + " ");

}

System.out.print("\n");

}

}

在上述代碼中贝攒,程序定義了符號常量SIZE盗誊,用于表征需要排序整型數組的大小。在主函數中隘弊,首先初始化隨機種子哈踱,然后對數組進行隨機初始化,并輸出排序前的數組內容梨熙。接著开镣,調用插入排序算法函數來對數組進行排序。最后咽扇,輸出排序后的數組邪财。

該程序的執(zhí)行結果陕壹,如圖2所示。圖中顯示了每一步排序的中間結果树埠。


圖1
圖2
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末糠馆,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子怎憋,更是在濱河造成了極大的恐慌又碌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绊袋,死亡現場離奇詭異毕匀,居然都是意外死亡,警方通過查閱死者的電腦和手機愤炸,發(fā)現死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門期揪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人规个,你說我怎么就攤上這事凤薛。” “怎么了诞仓?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵缤苫,是天一觀的道長。 經常有香客問我墅拭,道長活玲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任谍婉,我火速辦了婚禮舒憾,結果婚禮上,老公的妹妹穿的比我還像新娘穗熬。我一直安慰自己镀迂,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布唤蔗。 她就那樣靜靜地躺著探遵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪妓柜。 梳的紋絲不亂的頭發(fā)上箱季,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音棍掐,去河邊找鬼藏雏。 笑死,一個胖子當著我的面吹牛作煌,可吹牛的內容都是我干的诉稍。 我是一名探鬼主播蝠嘉,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杯巨!你這毒婦竟也來了蚤告?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤服爷,失蹤者是張志新(化名)和其女友劉穎杜恰,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體仍源,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡心褐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了笼踩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逗爹。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嚎于,靈堂內的尸體忽然破棺而出掘而,到底是詐尸還是另有隱情,我是刑警寧澤于购,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布袍睡,位于F島的核電站,受9級特大地震影響肋僧,放射性物質發(fā)生泄漏斑胜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一嫌吠、第九天 我趴在偏房一處隱蔽的房頂上張望止潘。 院中可真熱鬧,春花似錦辫诅、人聲如沸凭戴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽簇宽。三九已至勋篓,卻和暖如春吧享,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背譬嚣。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工钢颂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拜银。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓殊鞭,卻偏偏與公主長得像遭垛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子操灿,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容