二分插入排序
直接插入排序的算法简洁,容易实现,当n较小时时一种好的排序方法。当是一般情况下记录序列中的记录数量都很大,则此时直接插入排序方法就不适用了;
而二分插入排序是在直接插入排序基础上改进的一种排序算法。由于插入排序的操作是在一个有序序列中进行比较和插入的,而比较操作实际上就是在有序序列中作查找操作,这个“查找”操作可以用“二分查找”的方法来实现。按照这种思想,对直接插入排序改进后的排序方法称为二分插入排序,又称折半操作排序。与直接插入排序相比,二分插入排序仅仅减少了记录关键字的比较次数,而记录的移动次数没有改变;
示例:使用二分插入排序数组A={16, 15, 19, 16, 18, 19, 20, 14}
public class InsertSort {
/**
* 折半插入排序
*
*/
public void binInsertSort(int[] data) {
int key, left, rigth, middle;
for(int i = 1; i < data.length; i++) {
key = data[i];
left = 0;
rigth = i - 1;
while(left <= rigth) {
middle = (left + rigth)/2;
if (data[middle] > key) {
rigth = middle - 1;
} else {
left = middle + 1;
}
}
for(int j = i-1; j >= left; j--) {
data[j+1] = data[j];
}
data[left] = key;
}
}
}
二分插入排序算法与直接插入排序算法相比,需要的辅助空间与直接插入排序基本一致;时间上,二分插入排序的关键字比较次数比直接插入排序的最坏情况要少,比最好情况要多,两种插入排序方法的元素移动次数相同,因此二分插入排序算法的时间复杂度仍为0(n2)。
二分插入排序算法与直接插入排序算法的元素移动一样是顺序的,因此该算法也是为0(n2)种稳定的排序方法。