一組有序的陣列,我們向裡邊新增乙個新的資料後,如何保持資料有序呢?
首先,這是乙個動態排序過程,動態向有序集合中新增資料,通過不斷的插入資料保持資料的有序性,於是就有了插入排序。
我們將陣列中的資料分為兩個區間,已排序區間和未排序區間。初始已排序區間只有乙個元素,就是陣列的第乙個元素。插入演算法的核心思想是取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,並保證已排序區間資料一直有序。重複這個過程,直到未排序區間中元素為空,演算法結束。
插入排序也包含兩種操作,一種是元素的比較,一種是元素的移動。當我們需要將乙個資料 a 插入到已排序區間時,需要拿 a 與已排序區間的元素依次比較大小,找到合適的插入位置。找到插入點之後,我們還需要將插入點之後的元素順序往後移動一位,這樣才能騰出位置給元素 a 插入。
示例:
public static void main(string args)
integer a = new integer[set.size()];
set.toarray(a);
long l = system.currenttimemillis();
mp.insertionsort(a,a.length);
system.out.println("插入排序後:"+ arrays.tostring(a));
long l1 = system.currenttimemillis();
system.out.println(l1-l);
}//插入排序
// 插入排序,a 表示陣列,n 表示陣列大小
public void insertionsort(integer a, int n)
for (int i = 1; i < n; ++i) else
}a[j+1] = value; // 插入資料
}}
插入排序演算法的執行並不需要額外的儲存空間,所以空間複雜度是 o(1),也就是說,這是乙個原地排序演算法。
在插入排序中,對於值相同的元素,我們可以選擇將後面出現的元素,插入到前面出現元素的後面,這樣就可以保持原有的前後順序不變,所以插入排序是穩定的排序演算法。
如果要排序的資料已經是有序的,我們並不需要搬移任何資料。如果我們從尾到頭在有序資料組裡面查詢插入位置,每次只需要比較乙個資料就能確定插入的位置。所以這種情況下,最好是時間複雜度為o(n)。注意,這裡是從尾到頭遍歷已經有序的資料。
如果陣列是倒序的,每次插入都相當於在陣列的第乙個位置插入新的資料,所以需要移動大量的資料,所以最壞情況時間複雜度為 o(n2)。
通過測試,證明插入排序相比冒泡更受歡迎,當生成10萬資料時,冒泡不如插入排序,但是有沒有比插入排序效能更快的呢?請看通排序。
資料結構之插入排序 折半插入排序
排序思路 通過折半查詢的方式找到合適的插入位置再插入。演算法實現 public class biinsertsort else 插入點在 mid 1,right left mid 1 直到找到合適的位置 left或right 1 接下來就將left right 1後的元素後移 for int j i...
資料結構之 插入排序
包括 直接插入排序,二分插入排序 又稱折半插入排序 鍊錶插入排序,希爾排序 又稱縮小增量排序 假定這個陣列的序是排好的,然後從頭往後,如果有數比當前外層元素的值大,則將這個數的位置往後挪,直到當前外層元素的值大於或等於它前面的位置為止.這具演算法在排完前k個數之後,可以保證a 1 k 是區域性有序的...
資料結構之插入排序
插入排序有,直接插入排序 折半插入排序 2 路插入排序和表排序。如果了解了這些排序的思路,那麼 也就容易理解了。直接插入排序思路是 把第乙個當做已排好序的,直接從第二個開始記為當前資料 當前資料需要儲存到a 0 把a 0 當做乙個哨子 然後用當前資料跟前面的資料比下去,大於當前資料的數都往後移一位。...