插入排序
描述
插入排序就是给每一个数据找到相对应的位置并插进去 说的些许抽象, 记住这个“插入”圈起来要考。举个栗子 当数组遍历到第二个数据(数据2)时 首先会让数据2和在他前面的数据1 进行比较 如果数据1比较大 就会把数据2“插入”到数据1 前面。反之则一动不动。 遍历到数据3 时 首先会让数据3和在它前面的数据2 作比较 如果数据3 比数据2 大 则一动不动 反之 插入到数据2前面继续跟数据1比较 依次类推 当我们遍历完最后一个数据时 我们就可以得到一个有序数组(集合)了
图片加深理解(来源参考资料)
代码实现
public class InsertSort {
public static void main(String[] args){
int[] arr = {3,2,5,6,7,1,4};
insertSort(arr);
}
public static void insertSort(int[] arr){
for (int i = 1; i < arr.length ; i++) {
int insertVal = arr[i];
int insertIndex = i - 1;
//给insertVal找到要插入的位置
// insertIndex >= 0 保证在给insertVal找插入位置 不越界
// insertVal < arr[insertIndex] 待插入的值还没有找到插入位置 就需要将arr[insertIndex]后移
while (insertIndex >= 0 && insertVal < arr[insertIndex]){
arr[insertIndex + 1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex + 1] = insertVal;
}
System.out.println(Arrays.toString(arr));
}
复杂度
时间复杂度: O(N^2)
空间复杂度: O(1)
如果数据量在比较大的情况下使用插入排序的话 时间相对会比较久 但是相对于冒泡排序效率会有些许提升 因为插入排序存在一个情况 当前要进行排序的数据 比前一个数据大 就不会继续互相比较的代码 这里就会有一个性能上的提升。
参考资料
参考地址目的地
https://www.toutiao.com/a6593273307280179715/?iid=6593273307280179715
秃头萌新一枚 照顾不周 请多关照