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

    简单排序算法时间空间复杂度分析及应用(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开源社区拿来即用项目源码以及相关的文章。欢迎关注。

                                                                       

 

你可能感兴趣的:(java技术框架篇)