算法描述
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法流程如下
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。
动画展示
代码实现
public class InsertSort {
public static void main(String[] args) {
int[] arr = CommonStant.arr; // int[] arr = new int[]{1,3,4,7,9,0,12,41,4,68,1,2,4};
int length = arr.length;
for (int i = 1; i < length; i++) {
int value = arr[i];
int position = i;
while (position > 0 && value < arr[position - 1]) {
arr[position] = arr[position - 1];
position--;
}
arr[position] = value;
}
Arrays.stream(arr).forEach(System.out::println);
}
}
总结
稳定性:算法稳定,冒泡排序在排序前后两个相等的数相对位置不变。 时间复杂度:O(n^2),最好情况O(n), 最坏情况O(n^2)。 空间复杂度:O(1),不需要额外的变量进行存储。