插入排序
- 《算法导论》这本书介绍的第一个算法就是插入排序
 - 插入排序与冒泡排序一样, 都是时间复杂度 O(n²)的排序算法
 - 虽然时间复杂度是 O(n²) ,但JDK里实实在在是使用了它的
 

为什么JDK会用插入排序
为什么JDK这么追求效率,却还使用了时间复杂度较高的插入排序?
时间复杂度主要是衡量当输入增加的时候, 算法耗时的增长趋势, 记住只是趋势
但如果需要处理的数组很小呢? 那插入排序的优势就会体现出来, 虽然复杂度高, 但是在小规模的数组排序中表现效率还是非常好的
- 在JDK实现的排序代码中当元素小于7个的时候, 就会使用插入排序
 
实现
伪代码
INSERTION-SORT(A)for j=2 to A.lengthkey = A[j]i = j - 1while i > 0 and A[i] > keyA[i+1] = A[i]i = i - 1A[i+1] = key
Java实现
//排序最终数组从小到大排列public static void insertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {//内循环保证了下标0~i之间的数都是已经排好序的(不包括i)for (int j = i; j > 0; j--) {if (arr[j] < arr[j - 1]) {//只要比前面的小就与前面的换位置swap(arr, j, j - 1); //swap函数自己实现一下吧} else {break;}}}}
- 当数组已经有序的情况, 对插入排序是最好情况, 插入排序的时间复杂度为O(n);
 - 空间复杂度O(1)
 
