Java实现二分插入排序

 
  1. /***“二分插入排序”,利用二分查找优化插入排序中的定位部分。
  2. *《算法导论》,习题2.3-6
  3. *Observethatthewhileloopoflines5-7oftheINSERTION-SORTprocedurein
  4. *Section2.1usesalinearsearchtoscan(backward)throughthesorted
  5. *subarrayA[1j-1].Canweuseabinarysearch(seeExercise2.3-5)
  6. *insteadtoimprovetheoverallworst-caserunningtimeofinsertionsortto
  7. *Θ(nlgn)?*本文地址:http://mushiqianmeng.blog.51cto.com/3970029/732333
  8. *@authorlihzh(苦逼coder)
  9. */
  10. publicclassInsertSortWithBinarySearch{
  11. privatestaticint[]input=newint[]{2,1,5,4,9,8,6,7,10,3};
  12. publicstaticvoidmain(String[]args)
  13. {//从数组第二个元素开始排序,因为第一个元素本身肯定是已经排好序的
  14. for(intj=1;j<input.length;j++)
  15. {//复杂度n//保存当前值
  16. intkey=input[j];//利用二分查找定位位置
  17. intindex=binarySearch(input,input[j],0,j-1);//复杂度:lgn
  18. //将目标插入位置,同时右移目标位置右边的元素
  19. for(inti=j;i>index;i--)
  20. {//复杂度,最差情况:
  21. //(n-1)+(n-2)+...+n/2=Θ(n^2)
  22. input[i]=input[i-1];
  23. }
  24. input[index]=key;
  25. }
  26. /*
  27. *复杂度分析:
  28. *最佳情况,即都已经排好序,则无需右移,此时时间复杂度为:Θ(nlgn)
  29. *最差情况,全部逆序,此时复杂度为Θ(n^2)
  30. *所以针对2.3-6问题,无法将最差情况的复杂度提升到Θ(nlgn)。
  31. */
  32. //打印数组
  33. printArray();
  34. }
  35. /**
  36. *二分查找
  37. *@paraminput给定已排序的待查数组
  38. *@paramtarget查找目标
  39. *@paramfrom当前查找的范围起点
  40. *@paramto当前查找的返回终点
  41. *@return返回目标在数组中,按顺序应在的位置
  42. */
  43. privatestaticintbinarySearch(int[]input,inttarget,intfrom,intto)
  44. {
  45. intrange=to-from;//如果范围大于0,即存在两个以上的元素,则继续拆分
  46. if(range>0)
  47. {//选定中间位
  48. intmid=(to+from)/2;
  49. //如果临界位不满足,则继续二分查找
  50. if(input[mid]>target)
  51. {
  52. returnbinarySearch(input,target,from,mid-1);
  53. }
  54. else
  55. {
  56. returnbinarySearch(input,target,mid+1,to);
  57. }
  58. }
  59. else
  60. {
  61. if(input[from]>target)
  62. {
  63. returnfrom;
  64. }
  65. else
  66. {
  67. returnfrom+1;
  68. }
  69. }
  70. }
  71. privatestaticvoidprintArray()
  72. {
  73. for(inti:input)
  74. {
  75. System.out.print(i+"");
  76. }
  77. }
  78. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值