二分法排序C++

二分法排序C++include includevoidT intarray intn nbsp nbsp nbsp nbsp nbsp nbsp intleft right num nbsp nbsp nbsp nbsp nbsp nbsp intmiddle j i nbsp nbsp nbsp nbsp nbsp nbsp for i 1 i nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp left 0 准备 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp right i 1

首先说一下二分法排序的原理,算法思想简单描述: 
在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们 
中间的那个元素比,如果小,则对前半再进行折半,否则对后半 
进行折半,直到left>right,然后再把第i个元素前1位与目标位置之间 
的所有元素后移,再把第i个元素放在目标位置上。


二分法排序最重要的一个步骤就是查找要插入元素的位置,也就是要在哪一个位置上放我们要准备排序的这个元素。
当我们查找到位置以后就很好说了,和插入排序一样,将这个位置以后的所有元素都向后移动一位。这样就实现了二分法排序。
  然后是怎么查找着一个位置呢,就是不断的比较已排序的序列中的中间元素和要排序元素,如果大于的话,说明这个要排序的元素在已排序序列中点之前的序列。










#include


#include


void TwoInsertSort(int array[],int n)
{

           int left,right,num;
           int middle,j,i;
           for(i = 1;i < n;i++)
           {

                   left = 0;// 准备
                   right = i-1;
                   num = array[i];                 
                   while( right >= left)// 二分法查找插入位置
                   {

                           middle = ( left + right ) / 2;  // 指向已排序好的中间位置
                           if( num < array[middle] )// 即将插入的元素应当在在左区间

















               right = middle-1;
       else                    // 即将插入的元素应当在右区间
       left = middle+1;    

 
                 }

//每次查找完毕后,left总比right大一,a[left]总是存放第一个比num大的数,因此应从此处开始,每            //个元素右移一位,并将num存入a[left]中,这样就保证了a[0…i]是排好序的
          for( j = i-1;j >= left;j– )// 后移排序码大于R[i]的记录
              array[j+1] = array[j];
          array[left] = num;// 插入
      }
}




看了以后就会发现,其实就是插入排序法的一种修改,当a[0],a[1]…a[i-1]排好序,寻找第i个元素在其中的位置时采用二分查找法,于是该算法称二分排序法,所以我认为这不是新的算法;另外有人说起时间复杂度是n*lgn的,其实不是,就算每次查找的时间是lgi,但是查找完毕还要移动元素,这个时间平均为i/2,于是总时间为(1/2+lg1) + (2/2 + lg2) + (3/2 + lg3) + … + ((n-1)/2 + lg(n-1)), 约为n(n-2)/4+nlgn,所以时间复杂度还是n*n的。





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216105.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午12:32
下一篇 2026年3月18日 下午12:32


相关推荐

  • 揭秘!字节跳动新引擎即梦 AI

    揭秘!字节跳动新引擎即梦 AI

    2026年3月12日
    2
  • 电脑dnf,DNF卡顿如何解决_DNF卡顿如何解决 教你调整电脑参数畅玩游戏_52PKDNF「建议收藏」

    电脑dnf,DNF卡顿如何解决_DNF卡顿如何解决 教你调整电脑参数畅玩游戏_52PKDNF「建议收藏」DNF卡顿怎么解决?相信很多玩家电脑的配置并不差,但是就是玩DNF会卡。今天就在这里教大家一些优化的方法。让你轻松摆脱DNF卡顿带来的困扰。如果是硬件问题的可以换硬件,如果是软件设置问题的可以优化自己的设置。首先要说的由于系统版本和软件版本的问题,每一项设置带来的提升也会不同,需要各位玩家自己摸索,我也会讲一下自己在不同系统测试的感受。我的电脑信息:下面是方法汇总:一、硬件:1.显卡虽然之前一直有…

    2025年10月28日
    6
  • 【Python】python文件打开方式详解——a、a+、r+、w+、rb、rt区别[通俗易懂]

    【Python】python文件打开方式详解——a、a+、r+、w+、rb、rt区别[通俗易懂]第一步排除文件打开方式错误:r只读,r+读写,不创建w新建只写,w+新建读写,二者都会将文件内容清零(以w方式打开,不能读出。w+可读写)w+与r+区别:r+:可读可写,若文件不存在,报错;w+:可读可写,若文件不存在,创建r+与a+区别:fd=open(“1.txt”,’w+’)fd.write(‘123’)fd=open(“1.txt”,’r…

    2022年7月13日
    19
  • 计算机语言有哪些_计算机英语第五版刘艺pdf

    计算机语言有哪些_计算机英语第五版刘艺pdf计算机程序设计艺术 第3卷 排序和查找(英文影印版.第2版)

    2022年4月21日
    106
  • java拦截器_Java拦截器实现「建议收藏」

    java拦截器_Java拦截器实现「建议收藏」java拦截器实现功能类似于aop功能的实现,实现拦截部分方法,一般用于类似登录进入A页面,未登录进入B页面实现方法有两种实现Interceptor接口或者继承HandlerInterceptorAdapter类,实现接口需要实现其中所有方法,继承抽象类则一般实现preHandle方法即可。首先配置拦截类packagenet.parim.spark.portal.adapter;im…

    2022年6月10日
    173
  • 手把手教你学DSP(TMS320X281X) 2020-11-30

    手把手教你学DSP(TMS320X281X) 2020-11-30内容为自己看《手把手教你学dspTMS320X281X》(顾卫刚版)图书的笔记,只是记录一下自己学习的思想历程。由于自己硬件学习也是新手,如有错误,请评论或者私信指出,如果看见一定更正;如果感觉本文对您有帮助,可以给个点赞;顺便可以关注或收藏一波不迷路。

    2022年4月30日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号