排序之折半插入排序
Posted 路过你的全世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序之折半插入排序相关的知识,希望对你有一定的参考价值。
简介
二分查找(折半插入)排序属于插入类排序的一种,可以说是直接插入排序的一种改进版:主要改进在查找插入位置上节省了时间。
直接插入排序需要依次在有序的序列里进行比较,较大值右移一直到找到合适的位置进行插入。
二分查找排序节省了查找的时间。对于一个有序的序列来说,采用二分查找的方式来找到插入点比直接便利比较所费的时间少。使用二分查找排序找到插入点之后,依次后移插入点之后的数据,然后将要插入的值放进去,完成一次插入操作。
二分查找排序思想
二分查找排序主要基于对查找插入位置的时间进行优化,使用二分查找来缩短插入位置的查找时间。对于待排序的一个序列来说,假设要插入的是第N个数,则说明前N-1个数已经为有序,那么我们需要将第N个数插入到前N-1个数的序列中。
那么我们根据第N个数的值可以使用二分查找来找到前N-1个数的插入点位置。之后将插入点之后的值依次后移一位。最后将第N个值插入。这样,我们完成了依次插入过程,之后依次将剩余数字按照如上方式进行插入,最后实现序列有序。
二分查找排序代码
private static void binaryInsertSort(int[] array)
if (array == null || array.length == 0)
return;
int length = array.length;
int temp = 0;
int pre = 0;
int last = 0;
for (int i = 1; i < length; i++)
//要插入的值
temp = array[i];
pre = 0;
last = i - 1;
while (pre <= last)
int middle = (pre + last) >> 1;
if (temp > array[middle])
pre = middle + 1;
else if (temp < array[middle])
last = middle - 1;
//找到插入位置之后,将插入点之后的数据后移一位
for (int j = i - 1; j >= pre; j--)
array[j + 1] = array[j];
array[pre] = temp;
总结
折半插入排序其实就是直接插入排序的一种改进,引入了二分查找算法,这样关键字的比较次数就会减少,数量级为O(nlog^2n),但是元素移动次数还是O(n^2),所以折半插入排序的时间复杂度是O(n^2)。
另外,折半插入排序是稳定的排序算法;
以上是关于排序之折半插入排序的主要内容,如果未能解决你的问题,请参考以下文章