原理
插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
动画演示
思路讲解
- 将给定的数组分为两个区间:
①已排序区间[0,bound]
②未排序区间[bound,size) - 分别记录未排序区间的第一个元素和已排序区间最后一个元素的下标,依次比较待排序区间和已排序区间每个元素的大小关系,寻找合适的位置将待排序区间的元素插入已排序区间;
代码实现
代码如下:
public class Test {
//[0,bound)表示已排序区间
//[bound,size)表示待排序区间
public static void insertSort(int[] array){
for (int bound = 1; bound < array.length; bound++) {
//记录待排序区间的第一个元素
int ret = array[bound];
//记录已排序区间的最后一个元素的下标
int pos = bound-1;
//依次比较array[pos]和ret的大小
for (; pos >= 0 ; pos--) {
if (array[pos] > ret){
array[pos+1] = array[pos];
}else {
break;
}
}
//最终要将待排序区间的元素放到合适的位置
array[pos+1] = ret;
}
}
public static void main(String[] args) {
int[] array = {9,5,2,7,3,6,8};
insertSort(array);
System.out.println(Arrays.toString(array));
}
}
运行结果:
效率分析
稳定性
稳定
时间复杂度
O(n^2)
空间复杂度
O(1)
特点
- 当待排序区间元素较少的时候,排序效率很高;
- 当整个数组比较接近有序的时候,排序效率很高;