- /***“二分插入排序”,利用二分查找优化插入排序中的定位部分。
- *《算法导论》,习题2.3-6
- *Observethatthewhileloopoflines5-7oftheINSERTION-SORTprocedurein
- *Section2.1usesalinearsearchtoscan(backward)throughthesorted
- *subarrayA[1j-1].Canweuseabinarysearch(seeExercise2.3-5)
- *insteadtoimprovetheoverallworst-caserunningtimeofinsertionsortto
- *Θ(nlgn)?*本文地址:http://mushiqianmeng.blog.51cto.com/3970029/732333
- *@authorlihzh(苦逼coder)
- */
- publicclassInsertSortWithBinarySearch{
- privatestaticint[]input=newint[]{2,1,5,4,9,8,6,7,10,3};
- publicstaticvoidmain(String[]args)
- {//从数组第二个元素开始排序,因为第一个元素本身肯定是已经排好序的
- for(intj=1;j<input.length;j++)
- {//复杂度n//保存当前值
- intkey=input[j];//利用二分查找定位位置
- intindex=binarySearch(input,input[j],0,j-1);//复杂度:lgn
- //将目标插入位置,同时右移目标位置右边的元素
- for(inti=j;i>index;i--)
- {//复杂度,最差情况:
- //(n-1)+(n-2)+...+n/2=Θ(n^2)
- input[i]=input[i-1];
- }
- input[index]=key;
- }
- /*
- *复杂度分析:
- *最佳情况,即都已经排好序,则无需右移,此时时间复杂度为:Θ(nlgn)
- *最差情况,全部逆序,此时复杂度为Θ(n^2)
- *所以针对2.3-6问题,无法将最差情况的复杂度提升到Θ(nlgn)。
- */
- //打印数组
- printArray();
- }
- /**
- *二分查找
- *@paraminput给定已排序的待查数组
- *@paramtarget查找目标
- *@paramfrom当前查找的范围起点
- *@paramto当前查找的返回终点
- *@return返回目标在数组中,按顺序应在的位置
- */
- privatestaticintbinarySearch(int[]input,inttarget,intfrom,intto)
- {
- intrange=to-from;//如果范围大于0,即存在两个以上的元素,则继续拆分
- if(range>0)
- {//选定中间位
- intmid=(to+from)/2;
- //如果临界位不满足,则继续二分查找
- if(input[mid]>target)
- {
- returnbinarySearch(input,target,from,mid-1);
- }
- else
- {
- returnbinarySearch(input,target,mid+1,to);
- }
- }
- else
- {
- if(input[from]>target)
- {
- returnfrom;
- }
- else
- {
- returnfrom+1;
- }
- }
- }
- privatestaticvoidprintArray()
- {
- for(inti:input)
- {
- System.out.print(i+"");
- }
- }
- }
Java实现二分插入排序
最新推荐文章于 2022-11-01 15:49:26 发布