1.什么是插入排序
根据当插入位置index,与index左侧有序数组区逐个比对,比temp大的元素,向右移动, 如果小于则停止比对,跳出当前循环,最后插入临时元素,因为之前的循环 index 之前的数组已经是有序数组。
2.算法代码实现
/**
* 插入排序
* 根据当插入位置index,与index 前有序数组区逐个比对,比temp大的元素,向右移动,
* 如果小于则停止比对,跳出当前循环,因为之前的循环 index 之前的数组已经是有序数组。
* @param arr
*/
public static void insertSort_1(int[] arr){
for (int i = 1; i < arr.length; i++) {
//保存插入位数据
int temp = arr[i];
//插入元素位置
int insertIndex = i;
//对比待插入index前已完成排序的元素,找到temp 位置
int orderLength = i-1;
for (int j = orderLength; j >=0; j--) {
System.out.printf("insertSort_1 ==> 内循环比较次数:" + j + "\n\r");
if(arr[j] > temp){
//大于临时值,向右移动到空出插入位置
arr[j+1] = arr[j];
//移动完,空出来的index
insertIndex = j;
}else {
break;
}
}
//插入临时元素
if(insertIndex !=i){
arr[insertIndex] = temp;
}
System.out.printf("insertSort_1 ==> arr:" + Arrays.toString(arr) + "\n\r");
}
}
输出打印
insertSort_1 ==> 内循环比较次数:0
insertSort_1 ==> arr:[1, 4, 2, 5, 7, 9, 3, 21, 10]
insertSort_1 ==> 内循环比较次数:1
insertSort_1 ==> 内循环比较次数:0
insertSort_1 ==> arr:[1, 2, 4, 5, 7, 9, 3, 21, 10]
insertSort_1 ==> 内循环比较次数:2
insertSort_1 ==> arr:[1, 2, 4, 5, 7, 9, 3, 21, 10]
insertSort_1 ==> 内循环比较次数:3
insertSort_1 ==> arr:[1, 2, 4, 5, 7, 9, 3, 21, 10]
insertSort_1 ==> 内循环比较次数:4
insertSort_1 ==> arr:[1, 2, 4, 5, 7, 9, 3, 21, 10]
insertSort_1 ==> 内循环比较次数:5
insertSort_1 ==> 内循环比较次数:4
insertSort_1 ==> 内循环比较次数:3
insertSort_1 ==> 内循环比较次数:2
insertSort_1 ==> 内循环比较次数:1
insertSort_1 ==> arr:[1, 2, 3, 4, 5, 7, 9, 21, 10]
insertSort_1 ==> 内循环比较次数:6
insertSort_1 ==> arr:[1, 2, 3, 4, 5, 7, 9, 21, 10]
insertSort_1 ==> 内循环比较次数:7
insertSort_1 ==> 内循环比较次数:6
insertSort_1 ==> arr:[1, 2, 3, 4, 5, 7, 9, 10, 21]
3.总结
- 时间复杂度 -O(n^2)
- 最好情况 - O(n^2)
- 最坏情况 - O(n^2)
- 空间复杂度 - 只有一个交换临时变量temp,O(1)
- 稳定算法(保证重复元素的相对位置一致)