插入排序包括:直接插入排序,折半插入排序,希爾排序。
思想:
直接插入排序(straight insertion sorting)的基本思想是:把n個待排序的元素看成為乙個有序表和乙個無序表,開始時有序表中只包含乙個元素,無序表中包含有n-1個元素,排序過程中每次從無序表中取出第乙個元素,將它插入到有序表中的適當位置,使之成為新的有序表,重複n-1次可完成排序過程。
把a[i]插入到a[0],a[1],...,a[i-1]之中的具體實施過程為:先把a[i]賦值給變數t,然後將t依次與a[i-1],a[i-2],...進行比較,將比t大的元素右移乙個位置,直到發現某個j(0<=j<=i-1),使得a[j]<=t或j為(-1),把t賦值給a[j+1].
void insertsort(int *arr,int len)
}
時間複雜度o(n^2)
直接插入排序的基本操作是在有序表中進行查詢和插入,而在有序表中查詢插入位置,可以通過折半查詢的方法實現,由此進行的插入排序稱之為折半插入排序。折半查詢的過程是以處於有序表中間位置記錄的關鍵字和
ki比較,經過一次比較,便可排除一半記錄,把可插入的區間縮小一半,故稱為折半。折半插入排序僅減少了關鍵字間的比較次數,但記錄的移動次數不變。因此折半插入排序的時間複雜度仍為
o(n2)
。折半插入排序的空間複雜度與直接插入排序相同。折半插入排序也是乙個穩定的排序方法。
void binsert_sort(int *arr,int len)
}
希爾排序(
shell』s sort
)又稱縮小增量排序
(diminishing increment sort)
。它是希爾(
d.l.shell
)於1959
年提出的插入排序的改進演算法。如前所述,直接插入排序演算法的時間效能取決於資料的初始特性,一般情況下,它的時間複雜度為
o(n2)
。但是當待排序列為正序或基本有序時,時間複雜度則為
o(n)
。因此,若能在一次排序前將排序序列調整為基本有序,則排序的效率就會大大提高。正是基於這樣的考慮,希爾提出了改進的插入排序方法。
希爾排序的基本思想是:先將整個待排記錄序列分割成若干小組(子串行),分別在組內進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行一次直接插入排序。分割方法:選定乙個記錄的間隔值
d,將所有間隔
d的記錄作為一組。在組內進行直接插入排序。然後縮小間隔,重新分組,再進行組內重新排序,直到間隔為1為止
//共進行nun趟不同增量的插入排序
for(i=0;i
shell_insert3(arr, len,add[i]); //一趟增量為add[i]的插入排序
經典排序之插入排序
插入排序的思想很簡單,就是每向有序序列中插入乙個數,就把這個數依次與其他數比較,逐次替換。下面是 public class insertsort a i 1 keyword system.out.println arrays.tostring a public static void main st...
經典排序之插入排序
插入排序就是每一步都將乙個待排資料按其大小插入到已經排序的資料中的適當位置,直到全部插入完畢。插入排序方法分直接插入排序和折半插入排序兩種,這裡只介紹直接插入排序,折半插入排序留到 查詢 內容中進行。圖1演示了對4個元素進行直接插入排序的過程,共需要 a b c 三次插入。設陣列為a 0 n 1 1...
經典排序之插入排序
一 插入排序 1.基本思想 通過對未排序的資料逐個插入至合適的位置而完成排序工作。2.實現 public class insertionsort a j 1 t system.out.print 第 i 步排序結果 for h 0 h a.length h system.out.print n 在上...