插入排序
插入排序:对于当前索引,左边元素都是有序的,但是并不一定是元素的最终位置,为了给更小的元素腾出位置,需要移动位置。
与插入排序不同的是:如果数组的元素基本有序,则插入排序要比随机顺序的快很多。
算法描述:
(1)从第一个位置开始,认为该元素已经被排序
(2)取出下一个元素,在已经排序的元素序列中,从后向前扫描。
(3)如果该元素(已排序)大于新元素,则将该元素移到下一位置
(4)重复步骤3,知道找到已排序元素小于或者等于新元素的位置。
(5)将新元素插入到该位置后
(6)重复步骤2~5。
插入排序Java代码:
package algorithm.sort;
/**
* @author kaichen
* */
//插入排序
public class Inserter {
public static void sort(int[] arr){
int len = arr.length;
for(int i = 0; i < len; i++){
int temp = arr[i];
for(int j = i-1; j >= 0; j--){
if(arr[j] > temp){
swap(arr, j, j+1);
}else{
arr[j+1] = temp;
break;
}
}
}
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
时间复杂度
采用插入排序存在最好最坏情况,最好情况下就是序列已经是升序序列,只需要比较n-1次;最坏的情况下是序列是降序序列,需要比较n(n-1)/2.
最好的情况时间复杂度是O(n),最坏的情况时间复杂度是O(n^2),平均情况是O(n^2).
空间复杂度
插入排序的空间复杂度是O(1)
稳定性
是稳定排序
参考资料:
https://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F
算法(第四版)作者: 塞奇威克 (Robert Sedgewick) / 韦恩 (Kevin Wayn)译者: 谢路云