一.插入排查
- 平均时间复杂度 O(n^2)
- 最差时间复杂度 O(n^2)
- 最好时间复杂度 O(n)
- 空间复杂度 O(1)
- 稳定性 稳定的(排序过程不会破坏元素前后的相对顺序)
二.思路
- 插入排序 思路 将数组重新排序 分隔非已排序数组 和待排序数组 具体类似扑克牌 从前往后遍历,每到一个下标和前面的已排序数组进行比较 如果比他小就往前插,被比较的数组值往后移动一个下标
- 例子
943128675
第一次排序 493128675
第二次排序 349128675
第三次排序 134928675
…
通过上面的规律我们可以看出来 第一次排序 前两个数排序成功,第二次前三个数排序成功
第一次排序 是下标为1的9进行排序,插入到4前面,第二次是小标为2的3进行排序插入到最前面
因此我们每次只需要将要排序的数字和前面已经排序后的数列进行比较插入即可
三.实现
/**
* 插入排序 思路 将数组重新排序 分隔非已排序数组 和待排序数组 具体类似扑克牌 从前往后遍历,每到一个下标和前面的已排序数组进行比较 如果比他小就往前插,被比较的数组值往后移动一个下标
* @param array
* @return
* 平均时间复杂度:O(N^2)
* 最差时间复杂度:O(N^2)
* 空间复杂度:O(1)
* 排序方式:In-place
* 稳定性:稳定
*/
public static int[] insertionSorting(int[] array){
for(int i=0;i<array.length;i++){
//已经排序好的末尾下标 将待排序值与前面的已经排序好的值进行比较排序
int position = i-1;
for(int j=position;j>=0;j--){
//待排序值设置为temp
int temp = array[j+1];
if(temp<array[j]){
array[j+1] = array[j];
array[j] = temp;
}
}
}
return array;
}