標籤:
概述
將一個資料插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,是穩定的排序方法。
插入排序又分為 直接插入排序 和 折半插入排序。
直接插入排序
把待排序的紀錄按其關鍵碼值的大小逐個插入到一個已經排好序的有序序列中,直到所有的紀錄插入完為止,得到一個新的有序序列。
Java實現
public static void insertSort(int a[]){ int j; //當前要插入值的位置 int preJ; //依次指向j前的位置 int key; //後移時來暫存要插入的值 //從數組的第二個位置開始遍曆值 for(j=1;j<a.length;j++){ key=a[j]; preJ=j-1; //a[preJ]比當前值大時,a[preJ]後移一位 while(preJ>=0 && a[preJ]>key){ a[preJ+1]=a[preJ]; //將a[preJ]值後移 //這裡注意: a[preJ+1]=a[j]=key,把插入值已經存在了 key中 //等於說, 留出來一個空白位置來實現依次後移(不會造成資料丟失問題) preJ--; //preJ前移 } //找到要插入的位置或已遍曆完成((preJ=0) a[preJ+1]=key; //將當前值插入 空白位置 } }
備忘很清楚,我就不多說了....
效率分析
空間複雜度O(1)
平均時間複雜度O(n^2)
最差情況:反序,需要移動n*(n-1)/2個元素 ,已耗用時間為O(n^2)。
最好情況:正序,不需要移動元素,已耗用時間為O(n).
折半插入排序
直接插入排序中要把插入元素與已有序序列元素依次進行比較,效率非常低。
折半插入排序,使用使用折半尋找的方式尋找插入點的位置, 可以減少比較的次數,但移動的次數不變, 時間複雜度和空間複雜度和直接插入排序一樣,在元素較多的情況下能提高尋找效能。
Java實現
private static void binaryInsertSort(int[] a) { //從數組的第二個位置開始遍曆值 for(int i = 1; i < a.length; i++) { int key = a[i]; //暫存要插入的值 int pre = 0; //有序序列開始和結尾下標申明 int last = i - 1; // 折半尋找出插入位置 a[pre] while(pre <= last) { int mid = (pre + last) / 2; if(key < a[mid]) { last = mid - 1; } else { pre = mid + 1; } } //a[i]已經取出來存放在key中,把下標從pre + 1到 i-1的元素依次後移 for(int j = i; j >= pre + 1; j--) { a[j] = a[j - 1]; } //把值插入空白位置 a[pre] = key; } }
直接插入排序是,比較一個後移一個;
折半插入排序是,先找到位置,然後一起移動;
[資料結構] 插入排序