简单排序算法时间空间复杂度分析及应用(4)-二分插入排序

来源:互联网 发布:python 列表推导式 编辑:程序博客网 时间:2024/05/22 02:23

    简单排序算法时间空间复杂度分析及应用(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数据量大且无序的情况,这样会大大减少查询的时间,从而为整个插入排序节省时间,但是当大部分数据块都是已排序的,使用二分法就不如直接插入排序来得好。

         图文解析:

这属于插入排序的一种,图文分析和之前的插入排序都一样,可参考之前的插入排序图文分析。

         


阅读全文
0 0
原创粉丝点击