1.基本思想:
在排序算法中算是一种非常简单直观的排序算法。将第一个元素作为已排好的序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
2.算法分析:
时间复杂度:O(N^2)
空间复杂度:O(1)
稳定性: 稳定
3.算法实现:
//直接插入
public static void InsertSort(int[] array){
for (int i = 1 ;i < array.length ; i++){
int t = array[i];
int j =i-1;
while(j >= 0 && array[j] > t){
array[j+1] = array[j];
j--;
}
array[j+1] = t; //将待排元素插入正确位置
}
}
4.算法优化:
对于之间插入排序,在每趟插入过程中,都进行了两项工作:
(1)从前面的子序列中查找出带插入元素应该被插入的位置
(2)给插入位置腾出空间,将带插入元素复制到表中插入位置。
该算法总是变比较边移动。因为被比较的子序列是有序是,可以考虑二分查找的方法进行,虽然这样的比较次数变少约O(nlog2n),但移动次数不变,仍为O(N^2).
//折半插入
public static void InsertSort(int[] array){
int j;
for (int i = 1 ;i < array.length ; i++){
int low = 0, high = i-1;
int insert = array[i];
//二分查找待排元素应该插入的位置
while(low <= high){
int mid = (low + high)/2;
if (insert > array[mid]){
low = mid +1;
}else{
high = mid -1;
}
}
for (j = i; j > low ; j--){
array[j] = array[j-1];
}
array[j] = insert;
}
}