插入排序演算法、時間複雜度和穩定性
阿新 • • 發佈:2019-01-10
插入排序
演算法原理
- 將資料分為有序部分和無序部分。
- 在無序部分選擇一個元素,按照順序插入到有序部分,使之有序。
- 直到無序部分都插入到有序部分結束。
演算法分析
排序的思想就是維護一個有序的部分,將無序部分的資料按照順序插入到有序部分。
通俗的講,插入排序的原理就是:
先將最後一個元素作為有序部分,前面元素作為無序部分,將倒數第二個元素和最後一個元素比較,如果倒數第二個元素大於最後一個元素,則將倒數第二個元素查到最後一個元素的位置。
此時無序部分是第一個元素到倒數第三個元素,有序部分是最後兩個元素。
再將倒數第三個元素按照順序插入到最後兩個元素中,使得最後三個元素成為有序部分。
重複上面的插入規則,直到無序部分為空為止。
程式碼實現
/**
* @Title: insertSort
* @Description: 插入排序
* @param: array
*/
public static void insertSort(int[] array) {
int n = array.length;
for (int i = 0; i < n - 1; i++) {
// 標記無序部分最後一個元素,作為待插入元素
int k = n - 1 - i - 1;
int j;
// 遍歷有序部分,將array[k]與有序部分元素進行比較
for (j = k + 1; j < n; j++) {
// 找出待插入元素的位置 j-1
if (array[k] <= array[j]) {
break;
}
}
// 將待插入元素插入到有序部分
if (k != j - 1) {
insertItem(array, k, j - 1);
}
}
}
/**
* @Title: insertItem
* @Description : 把陣列array下標為i的元素插入到下標為j的位置
* @param: array
* @param: i
* @param: j
*/
private static void insertItem(int[] array, int i, int j) {
int temp = array[i];
for (int k = i + 1; k <= j; k++) {
array[k - 1] = array[k];
}
array[j] = temp;
}
時間複雜度和演算法穩定性
從程式碼中可以看出一共遍歷了n-1 + n-2 + … + 2 + 1 = n * (n-1) / 2 = 0.5 * n ^ 2 - 0.5 * n,那麼時間複雜度是O(N^2)。
因為在有序部分元素和待插入元素相等的時候,可以將待插入的元素放在前面,所以插入排序是穩定的。
喜歡這篇文章的朋友,歡迎長按下圖關注公眾號lebronchen,第一時間收到更新內容。