插入排序
思路
-
双层循环
-
将一个数组分成两部分,左边部分为排好序的数组,右边部分为待排序的数据
-
左边数组的第一位,不需要参加外层循环
-
从分界点的索引位置(拆分成两个数组的index),向左侧数组循环,从尾向头循环
-
因为左侧数组是有序的,所以,如果运气好,满足排序条件,直接break即可,倒霉情况下,需要循环到左侧数组头部
示例代码如下
/**
* 插入排序
*
* @param array
*/
public static void insertSort(int[] array) {
int length = array.length;
// 0 - i 是有序数组
for (int i = 1; i < length ; i++) {
int data = array[i];
// 从后向前遍历
for (int j = i - 1; j >= 0; j--) {
int value = array[j];
if (value > data) {
// 位置替换
array[j + 1] ^= array[j];
array[j] ^= array[j +1];
array[j + 1] ^= array[j];
} else {
break;
}
}
// 排序结果打印,无任何意义
System.out.print(" i= " + i +", array=");
for (int i1 : array) {
System.out.print( i1 + " ");
}
System.out.println();
}
}
时间复杂度和空间复杂度
插入算法排序时间和空间复杂度都是 O(n^2)
优化思路
插入算法最优情况就是 O(1),也就是从头到尾触发的都是break, 但是这只是理想效果,优化的方式也是想办法尽可能的去触发break,降低时间复杂度,所以就产生了新的排序方式,希尔排序