第乙個數預設有序。從第二個數開始,從後往前掃瞄。若取出數 < 當前數,則指標不斷前移,直到取出數 >= 當前數時,把取出數插入到當前位置。
public
static
int[
]insertsort
(int
arr)
arr[pre+1]
= cur;
}return arr;
}
以下過程具體說明了兩個數是怎麼實現有序的
pre
index: 1 2
data: 5 2 cur = 2
->
arr[pre+1] = arr[pre]
preindex: 1 2
data: 5 5 cur = 2
->
--pre
preindex: 0 1 2
data: 5 5 cur = 2
->
arr[pre+1] = cur;
preindex: 0 1 2
data: 2 5 cur = 2
最好的情況是序列已完全有序,則程式只for迴圈一次,while迴圈不執行,複雜度為o(n);最壞的情況是序列完全倒序,for迴圈掃瞄一輪,while迴圈也從後往前全部兩兩交換了一輪,複雜度為o(n^2); 平均複雜度為o(n^2);
該排序演算法不改變相同元素的相對位置,所以是穩定的。
直接插入第二種寫法
public
void
insert
(int
arr)
}}
利用二分查詢,能夠更快的定位元素,不用乙個個向前移動尋找了
public
void
insert
(int
arr)
}public
intbinarysearch
(int
arr,
int key,
int low,
int high)
return low;
}
使用了乙個增量,初始值為一般設為math.floor(arr.length / 2);該增量把序列劃分為幾個gap,對跨gap的數進行直接插入排序,而後gap為 math.floor(gap / 2),直到最後一輪 gap=1
public
static
int[
]insertsort
(int
arr)
arr[j]
= cur;}}
return arr;
}
外層for迴圈不是在做迴圈。內層for迴圈從初始gap值處開始遍歷陣列,複雜度情況與直接插入排序一致,若序列已有序,複雜度為o(n);若完全倒序,複雜度為o(n^2);平均複雜度問題未解決,尚為數學界難題。
該排序演算法改變相同元素的相對位置,所以是不穩定的。
插入排序 直接插入排序 二分插入排序 希爾排序
選擇排序是一種較為簡單的排序演算法。它的實現原理是每一次從待排序的資料元素中挑出乙個最小 大 的元素,存放在資料的起始 末尾 位置,直到所有待排序的資料排完。直接插入排序 當插入第i個元素的時候,我們認為它前面的i個元素已序。這時候用array i 的排序嗎與前面的排序碼進行比較,找到適合的位置就進...
排序演算法 插入排序 直接插入
借鑑的網上排序演算法資料 寫一下自己怎麼理解的直接插入排序的 只是為了自己看懂 以便忘記的時候檢視,希望大神不要噴,有什麼不好的可以指出 詳細的請看 public static int a public void print int a system.out.println test 檔案初態不同時...
排序 直接插入排序,二分插入排序,執行時間對比
typedef struct 可以 換成 struct,試了下也對 typedef struct node 順序表的儲存結構 typedef struct sqlist 順序表型別 換成 struct node 順序表的儲存結構 struct sqlist include include inclu...