排序算法中的直接插入排序是将数据插入到合适位置完成排序;
思路
- 先是将前面两个比较做交换,有必有时交换位置,组成一个有序区;
- 再将3个数和之前有序区对比,将第三个数插入到合适位置;
- 重复以上操作, 以致数据完成最后排序;
Demo 完整源码地址
/**
* @Title: 排序基本算法
* @Package ${package_name}
* @Description: 排序基本算法
* Created by eason_hoo on 16/8/7.
*/
public abstract class BaseSorter {
//构造sort函数
public abstract void sort(int[] array);
}
/**
* @Title: 直接插入排序
* @Description: 直接插入排序 有N条数据需要N-1中间排序 思路简单效果较好
* 如果数据是无规则,需要移位的数据非常多,效果下降
* Created by eason_hoo on 16/8/7.
*/
public class DirectInsertionSorter extends BaseSorter {
@Override
public void sort(int[] array) {
int temp;
for (int i = 1; i < array.length; i++){
temp = array[i]; //记录最外层当前的循环的i值
if(array[i] < array[i - 1]){ //当array[i] < array[i-1]值需要做交换
int j = i - 1;
//当array[i] < array[i-1]需要和有序区挨个比较移位
while (j >= 0 && temp < array[j]){
//当前值小于有序数据最大值,有序数据向后移一位
array[j + 1] = array[j];
//有序数组挨个比较
j--;
}
//如果是array[0]不用移位
array[j + 1] = temp;
}
}
}
}
算法分析
时间复杂度:
最好的情况: 有序、比较次数N-1 次、 移动0 次
最坏的情况: 逆序、每次从无序区取出第一个元素,首先需要与有序区最后一个元素比较一次,然后继续从有序区的最后一个元素比
较,直到比较到有序区第一个元素,然后插入到有序区首位置。
然后再将tmp与有序区元素比较,这个比较过程一共移动的次数为:有序区数组大小,最后还要将拷贝tmp移动插入到有序区的位置上。
在这个过程中:
有序区数组大小为1时,比较2次,移动3次;
有序区数组大小为2时,比较3次,移动4次;
……
有序区数组大小为n-1时,比较n次,移动n+1次。
可见:
比较的次数为:2+3+……+n = (n+2)(n-1)/2
移动的此时为:3+4+……+n+1 = (n+4)(n-1)/2
so 直接插入排序的时间复杂度为O(n2)
空间复杂度:
在整个排序过程中都是使用一个temp so直接插入排序空间复杂度为 O(1)
排序稳定性:
直接插入排序是稳定排序