插入排序是一种简单直观的排序算法。它的工作原理非常类似于我们抓扑克牌
对于未排序数据(右手抓到的牌),在已排序序列(左手已经排好序的手牌)中从后向前扫描,找到相应位置并插入。
1.算法性能
平均时间复杂度 : O(n^2)
最优时间复杂度: O(n)
最差时间复杂度: O(n^2)
空间复杂度: O(1)
稳定性: 不稳定
2.算法步骤
将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
3. 动图演示
4.Go 代码实现
func insertionSort(arr []int) {
length := len(arr)
// i从1开始,默认第一张牌arr[0]是有序的
for i := 1; i < length; i++{
for j := i; j > 0; j-- {
//拿右边的牌与左边有序的进行比较,如果大于左边有序的位置不变
if arr[j] >= arr[j-1] {
break
}
//小于左边有序的交换位置
arr[j],arr[j-1] = arr[j-1],arr[j]
}
}
}
5.Java 代码实现
public static void insertionSort(int[] arr) {
for (int i =1;i
for (int j = i;j>0;j--) {
if (arr[j] >= arr[j-1]){
break;
}
int temp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = temp;
}
}
}