插入排序簡單來說 就是將乙個資料插入到已經到排好的序列中,但要求插入後仍然有序。這種方法一般適用少量資料的。
一、主要的插入排序
直接插入排序 , 二分插入排序 , 鍊錶插入排序,希爾排序, 是屬於穩定排序的一種。
二、直接插入排序:
把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...