简单排序算法时间空间复杂度分析及应用(4)-二分插入排序
背景:
顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直接循环 比较变为二分法的方式来查询,在这确定区域数据都是已经排好序了的。
分析:
这种插入排序属于插入排序中的先确定插入位置,后进行插入操作,因此在内循环中有两个同级别的循环体。
代码实现:
/*
* 二分法插入排序(binary insert Sort)
* 时间复杂度为O(n的平方) ,最好的情况是元素交换次数为0,元素比较次数为n-1。
* @param sortOrder true表示增序,FALSE表示降序
* 第一种插入排序:这种插入排序有查找节点的步骤,采用的是二分法查询,这种查询方式只能在确定区域使用
* 这一种插入排序:插入排序改进,同级别的内循环有两个,第一个是获取插入位置,第二个是移动确定区域元素
*/
public static void insertSortBinary(boolean sortOrder){
int k ;
for(int m = 1 ; m < array.length ; ++m)
{
// for(n = m - 1 ; n >= 0 ; --n)
// if((array[m] > array[n]&&sortOrder)||(array[m] < array[n]&&!sortOrder))
// break;
/*
* 二分法查询
*/
int p , q , mid;
p = 0 ;//确定区域起点
q = m-1;//确定区域终点
//错误点:我本来设计的就是可以相等,却没在这个不等式中表现出来!
while(p <= q)
{
mid = (p+q)/2;
if((array[mid] < array[m]&&sortOrder)||(array[mid] > array[m]&&!sortOrder))
{
p = mid + 1;
}
else
{
q = mid - 1;
}
}
int z ;
k = array[m];
for(z = m-1 ; z > p - 1 ; --z)
array[z+1] = array[z];
// if(array[m]!=k)
array[z+1] = k;
}
}
使用场景:
二分法插入排序和之前的一种直接插入排序几乎一样,只是这个插入排序中的插入位置查询模块使用了二分法查询,这种插入排序适用于n数据量大且无序的情况,这样会大大减少查询的时间,从而为整个插入排序节省时间,但是当大部分数据块都是已排序的,使用二分法就不如直接插入排序来得好。
图文解析:
这属于插入排序的一种,图文分析和之前的插入排序都一样,可参考之前的插入排序图文分析。
talk is cheap ,show you the code and the doc,更多的分享内容请关注我的工作号:大白共图社。公众号会有很多的github开源社区拿来即用项目源码以及相关的文章。欢迎关注。