导航:
插入排序的思想很简单,我们可以把需要排序的数组分成两个序列,一个是已排序的序列,另一个是还未排序的序列,我们只需要取出未排序序列中的第一个元素,再与已排序序列的元素进行逐个比较,遇到比这个元素大的元素,就让这个大的元素往后移,遇到比这个元素小的元素,那就证明前面的所有元素都比这个元素小,就不需要再进行后面的比较了,直接插在这个小的元素后面就行了。
代码实现:
public class InsertionSort {
public static void main(String[] args) {
//定义数组
int[] arr = {99, 55, 2, 3, 9, 10, 22, 34, 67, 89, 69, 92};
//未排序序列的开头位置
int index = 1;
sort(arr, index);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
//排序
//arr:需排序的数组
//index:未排序序列的开头位置
public static void sort(int[] arr, int index) {
//target:插入的位置
int target = index;
//current:未排序序列的开头具体的值
int current = arr[index];
//从已排序序列的最后一个元素开始比较
for (int i = index - 1; i >= 0; i--) {
if (arr[i] > current) {
//前面的数比当前取出的元素大就往后移
arr[i + 1] = arr[i];
//记录下这个位置,方便后面插入
target = i;
} else {
//前面的数比当前取出的元素小就跳出循环,
//target位置就是可以插入的位置
break;
}
}
//插入
arr[target] = current;
//未比较序列开头的位置往后移
index++;
if (index < arr.length) {
//当数组中还存在未排序序列的时候就继续进行排序
sort(arr, index);
}
}
}
输出:
2
3
9
10
22
34
55
67
69
89
92
99
与选择排序相比较:
与选择排序相比,他们的思想首先都是将数组分成两个序列,但是选择排序是从未排序序列中选出最小的元素,再与未排序序列开头元素交换位置,而插入排序是从未排序序列中取第一个元素,然后在已排序序列中找到合适的位置进行插入。
两者的时间复杂度在平均和最坏的情况下是一样的,都是O(n^2),但是在最好的情况下插入排序比选择排序好,因为选择排序算法就算是用已经排序好的数组,算法也需要遍历所有未排序序列的元素才能确定谁才是未排序序列里最小的元素,所以选择排序在最好的情况下时间复杂度也是O(n^2)。而插入排序呢,算法只需要取出未排序序列开头元素,再与前面已排序序列的元素进行比较,当发现前面的元素比自己小,就不需要再进行比较了,插入排序在最好的情况下时间复杂度是O(n),表现比选择排序好。
本文动图演示引自:https://www.cnblogs.com/onepixel/articles/7674659.html