写在前面
- 楼主整理经典的排序算法
- 记录学习
3. 插入排序(InsertionSort)
3.1 概念
插入排序(InsertionSort),一般也被称为直接插入排序。
对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表
在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。
3.2 算法描述
- 把待排序的数组分成已排序和未排序两部分,初始的时候把第一个元素认为是已排好序的。
- 从第二个元素开始,在已排好序的子数组中寻找到该元素合适的位置并插入该位置。
- 重复上述过程直到最后一个元素被插入有序子数组中
示意图
3.3 代码演示
package com.zhuang.algorithm;
import java.util.Arrays;
/**
* @Classname InsertionSort
* @Description 插入排序
* @Date 2021/6/13 15:20
* @Created by dell
*/
public class InsertionSort {
public static void main(String[] args) {
int[] arr =new int[]{0,5,6,1,8,2};
insertionSort(arr);
System.out.println(Arrays.toString(arr));//[0, 1, 2, 5, 6, 8]
}
public static void insertionSort(int[] arr){
//第二个元素开始遍历
for (int i = 1; i < arr.length; i++) {
int value = arr[i];
int position=i;
while (arr[position-1]>value){
arr[position]=arr[position - 1];
position--;
}
arr[position]=value;
}
}
}
3.4 算法分析
- 最佳情况:T(n) = O(n)
- 最坏情况:T(n) = O(n2)
- 平均情况:T(n) = O(n2)
3.5 稳定性
由于只需要找到不大于当前数的位置而并不需要交换,因此,直接插入排序是稳定的排序方法。
3.6 适用场景
插入排序由于O( n2 )的复杂度,在数组较大的时候不适用。但是,在数据比较少的时候,是一个不错的选择,一般做为快速排序的扩充。例如,在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充,用于少量元素的排序。又如,在JDK 7 java.util.Arrays所用的sort方法的实现中,当待排数组长度小于47时,会使用插入排序。
写在最后
- 学习阶段,描述不当地方,还请大家在评论区指出
- 继续加油!