插入排序
算法原理
- 将数据分为有序部分和无序部分。
- 在无序部分选择一个元素,按照顺序插入到有序部分,使之有序。
- 直到无序部分都插入到有序部分结束。
算法分析
排序的思想就是维护一个有序的部分,将无序部分的数据按照顺序插入到有序部分。
通俗的讲,插入排序的原理就是:
先将最后一个元素作为有序部分,前面元素作为无序部分,将倒数第二个元素和最后一个元素比较,如果倒数第二个元素大于最后一个元素,则将倒数第二个元素查到最后一个元素的位置。
此时无序部分是第一个元素到倒数第三个元素,有序部分是最后两个元素。
再将倒数第三个元素按照顺序插入到最后两个元素中,使得最后三个元素成为有序部分。
重复上面的插入规则,直到无序部分为空为止。
代码实现
/**
* @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)。
因为在有序部分元素和待插入元素相等的时候,可以将待插入的元素放在前面,所以插入排序是稳定的。
相关代码都在github上:https://github.com/LebronChenX/sort
喜欢这篇文章的朋友,欢迎长按下图关注公众号lebronchen,第一时间收到更新内容。