关于插入排序,分析其时间复杂度的时候,需要根据数据状况进行分析。
-
初认,插入排序
-
插入排序工作原理:
- 通过构建有序序列,对于未排序的数据,在已排序的序列中从后向前扫描,找到相应的位置并插入。
-
插入排序分类:
- 直接插入排序
- 希尔排序
- 折半插入排序
-
原理流程图:
-
假设数组[3,1,4,2,5],初始下标为0的位置,默认为已排序。
-
第一次,进行插入排序,下标范围为[0,1],也就是数值1,进行寻找合适位置的插入,1应该插入到3的前面。
-
第二次,下标范围变成[0,2],即数值4加入排序序列,应为满足升序所以不需要进行插入。
-
第三次,下标范围变成[0,3],即数值2加入排序序列,2的位置应该在3的前面,所以进行合适的插入。
-
第四次,下标范围变成[0,4],最终使数组有序。
-
就像打斗地主,每次拿牌的时候都会整理一下,遇到顺子都需要手动将牌插到合适的位置。
-
-
-
直接插入排序代码
-
代码很简单,笔者就不做过多叙述。其他的排序代码,笔者并不想学,哈哈。
public static void sort(int[] arr) { // 参数检查 if(arr.length < 2 || arr == null) return ; // 下标0, 默认为有序 for(int i = 1; i < arr.length; i++) { // 每次范围加1 for(int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { int tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } }
-
-
时间复杂度分析
- 直接插入排序和选择和冒泡不一样,直接插入排序和数据状况有关。
- 比如,最好情况,数组一开始就是有序的,复杂度仅仅是遍历,即O(N)。
- 最坏情况,即数组倒序[5,4,3,2,1],那么这时候
- 直接插入排序和选择和冒泡不一样,直接插入排序和数据状况有关。