插入排序
插入排序和玩扑克牌一样,每一次迭代都选去当前元素最合适插入的位置,每一次选都从高往低找这个合适的位置。
首先选第一个元素为有序区
第一轮,8>5,所以无需交换。
第二轮,6<8,则交换,
6>5,无需交换。
每一轮结果如下:
优化
待插入的元素在未到达最终位置的时候,会交换很多次,这是一个缺点。
此时可以将当前待插入的元素暂存起来,然后将有序区的元素逐一向后复制。
例如,当前需要寻找待插入元素3的位置,可以用insertValue将3存储起来。
上代码(优化之后):
public static void insertsort(int[] array) {
for (int i = 1; i < array.length; i++) {
int insertValue = array[i];
int j = i - 1;
//从右向左比较元素的同时,进行元素复制
for (; (j >= 0) && (insertValue < array[j]); j--) {
array[j + 1] = array[j];
}
//insertValus的值插入适当位置
array[j + 1] = insertValue;
}
}
public static void main(String[] args) {
int[] array = {12, 1, 3, 46, 5, 0, -3, 12, 35, 16};
insertsort(array);
System.out.println(Arrays.toString(array));
}
时间复杂度:插入排序需要进行n-1轮,每一轮在最坏的情况之下需要比较的次数是1次、2次、3次,…,n-1次,所以最坏的情况下时间复杂度是O(n2)。
空间复杂度:由于是原地排序,所以空间复杂度是O(1)。