排序演算法 插入排序

2021-06-20 20:38:15 字數 2867 閱讀 3503

插入排序簡單來說 就是將乙個資料插入到已經到排好的序列中,但要求插入後仍然有序。這種方法一般適用少量資料的。

一、主要的插入排序

直接插入排序 , 二分插入排序 , 鍊錶插入排序,希爾排序, 是屬於穩定排序的一種。

二、直接插入排序:

把n個待排序的元素看成為乙個有序表和乙個無序表,開始時有序表中只包含乙個元素,無序表中包含有n-1個元素,排序過程中每次從無序表中取出第乙個元素,將它插入到有序表中的適當位置,使之成為新的有序表,重複n-1次可完成排序過程。

(一)簡單方法

首先在當前有序區r[1..i-1]中查詢r[i]的正確插入位置k(1≤k≤i-1);然後將r[k..i-1]中的記錄均後移乙個位置,騰出k位置上的空間插入r[i]。

注意:若r[i]的關鍵字大於等於r[1..i-1]中所有記錄的關鍵字,則r[i]就是插入原位置。

(二)改進的方法

一種查詢比較操作和記錄移動操作交替地進行的方法。具體做法:

將待插入記錄r[i]的關鍵字從右向左依次與有序區中記錄r[j](j=i-1,i-2,…,1)的關鍵字進行比較:

① 若r[j]的關鍵字大於r[i]的關鍵字,則將r[j]後移乙個位置;

②若r[j]的關鍵字小於或等於r[i]的關鍵字,則查詢過程結束,j+1即為r[i]的插入位置。

關鍵字比r[i]的關鍵字大的記錄均已後移,所以j+1的位置已經騰空,只要將r[i]直接插入此位置即可完成一趟直接插入排序。

(三)哨兵的作用

演算法中引進的附加記錄r[0]稱監視哨或哨兵(sentinel)。

哨兵有兩個作用:

① 進人查詢(插入位置)迴圈之前,它儲存了r[i]的副本,使不致於因記錄後移而丟失r[i]的內容;

② 它的主要作用是:在查詢迴圈中"監視"下標變數j是否越界。一旦越界(即j=0),因為r[0].key和自己比較,迴圈判定條件不成立使得查詢迴圈結束,從而避免了在該迴圈內的每一次均要檢測j是否越界(即省略了迴圈判定條件"j>=1")。

三、效能

直接插入排序屬於穩定的排序,最壞時間複雜性為o(n^2),空間複雜度為o(1)。

四、演算法:

不帶哨兵:

public void directinsertsort(int a) 

a[j] = temp;

} }

帶哨兵的演算法

public void directwithshao(int a) 

for (int i = 1; i < arr.length; i++) }}

五、測試結果

package com.albertshao.algorith.study;

public class directinsertsort ;

directinsertsort dis = new directinsertsort();

dis.directwithshao(a);

} public void directinsertsort(int a)

a[j] = temp;

system.out.print("第" + (i+1) +"趟: ");

for (int k = 0; k < a.length; k++)

system.out.println();

} }public void directwithshao(int a)

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

system.out.print("第" + (i) +"趟: 哨兵(" + arr[0]+") ");

for (int k = 1; k < arr.length; k++)

system.out.println();

} }}

執行結果:

第1趟: 哨兵(46) 46 58 15 45 90 18 10 62 

第2趟: 哨兵(58) 46 58 15 45 90 18 10 62

第3趟: 哨兵(15) 15 46 58 45 90 18 10 62

第4趟: 哨兵(45) 15 45 46 58 90 18 10 62

第5趟: 哨兵(90) 15 45 46 58 90 18 10 62

第6趟: 哨兵(18) 15 18 45 46 58 90 10 62

第7趟: 哨兵(10) 10 15 18 45 46 58 90 62

第8趟: 哨兵(62) 10 15 18 45 46 58 62 90

第1趟: 46 58 15 45 90 18 10 62 

第2趟: 46 58 15 45 90 18 10 62

第3趟: 15 46 58 45 90 18 10 62

第4趟: 15 45 46 58 90 18 10 62

第5趟: 15 45 46 58 90 18 10 62

第6趟: 15 18 45 46 58 90 10 62

第7趟: 10 15 18 45 46 58 90 62

第8趟: 10 15 18 45 46 58 62 90

排序演算法 插入排序

插入排序 insertion sort 的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in place排序 即只需用到o 1 的額外空間的排序 因而在從後向前掃瞄過程中,需要反覆把已排...

排序演算法 插入排序

排序演算法之插入排序 參照新版程式 下面是錯誤的理解,正確的參考,後文已經修改過的部分。選擇排序,顧名思義,就是選擇乙個元素進行排序。原理 將原始序列分成兩部分,一部分已經有序,一部分無序。將無序中的元素逐個插入到有序序列中。這個也是兩層迴圈,就我個人理解,與氣泡排序是乙個原理。氣泡排序是每次都從無...

排序演算法 插入排序

對於長度為n的陣列,遍歷其中元素,並且將其插入其之前一段有序資料中合適的位置。1 從第1個資料取起,向其之前 第0個 查詢第乙個小於該資料的位置為i 2 將i之後的元素向後轉移1位 3 將該元素放入第i 1位。include int main int j,k,temp for i 1 i n i d...