`
java-mans
  • 浏览: 11741336 次
文章分类
社区版块
存档分类
最新评论

【100题】第四十八题 移位数组的二分查找

 
阅读更多

一,题目

一个数组是由一个递减数列左移若干位形成的,比如{432165}是由{654321}左移两位形成的,在这种数组中查找某一个数。


二,分析

1)在此序列不断二分的过程中,由于原序列是一个递减序列经过旋转得到的,将它从任何位置分开,都会得到两个序列,

其中一个是递减序列

另一个可以通过一个递减序列通过旋转得到。

2)这样在不断地二分查找时,我们处理的序列子片段要么就是一个旋转后递减序列,要么就是一个纯递减序列,

3)无论是前者还是后者,在继续分成两个片段时,至少有一个纯递减序列(可能两个都是,如果之前的序列片段就是纯递减序列的话)。

4)这样我们可以保证能找到一个片段是纯递减序列(if(data[i]>=data[j]))

5)然后判断我们要找的数是否在这个片段中(这是很直观的,if(data[i]<=num&&num<=data[j])),如果在则继续在此片段中查找,否则说明在另一个序列中,则递归在其中查找

三,源码

#include<iostream>
using namespace std;
int bisearch(int a[],int left,int right,int num)
{
 if(a==NULL||right<0)  
        return -1;  

    if(left==right)//还剩下一个值的时候 
    {  
        if(a[left]==num)  
            return left;  
        else  
            return -1;  
    }     

   //int mid=(left+right)/2;
   int mid=left+(right-left)/2;
   
   if(a[mid]==num)
       return mid;
       
   if(a[mid]<=a[left])//左侧纯递减 
   {
       if(num>a[mid]&&num<=a[left]) //左侧 
            return bisearch(a,left,mid-1,num);
       else
           return bisearch(a,mid+1,right,num);
   }
   else    //右侧纯递减 
   {
      if(num>=a[right]&&num<a[mid]) //右侧 
      		return bisearch(a,mid+1,right,num);
  	  else
     		return bisearch(a,left,mid-1,num);
   }
}
int main()
{
 int a[100]={4,3,2,1,6,5};
    cout<<bisearch(a,0,5,6)<<endl;
 return 0;
}




分享到:
评论

相关推荐

    Java练习题,实用于Java大部分人群

    ### Java练习题知识点详解 #### 1. 斐波那契数列 - **知识点**:斐波那契数列是一种常见的数学数列,每个数是前两个数的和(除了前两个数)。数列从0和1开始,后续每一项都是前两项之和。 - **实现方法**: - 使用...

    算法_三十七章集锦by_July

    11. 第二十五章对二分查找的实现进行了深入探讨,并指出这是90%的程序员都无法正确实现的算法之一。 12. 第二十六章到第二十九章内容涉及到了排序、字符串编辑距离、格子取数、完美洗牌算法等。 13. 第三十章到第...

    中科大软件学院历年面试真题.pdf

    - **二分查找**: O(logn)。 - **哈希查找**: 平均O(1),最坏O(n)。 - **二叉树查找**: O(h),其中h为树的高度。 **22. m阶的B-树和m阶的B+树的主要区别** - **B-树**: 每个节点最多有m个子节点。 - **B+树**: 所有...

    c语言经典案例

    实例025 二分查找 31 实例026 分块查找 32 实例027 哈希查找 34 实例028 斐波那契数列 37 实例029 哥德巴赫猜想 38 实例030 尼科彻斯定理 39 第4章 常用数据类型 41 实例031 数值型常量的使用 42 实例032 字符型变量...

    中科大软件学院面试真题-2013最新版

    21. 折半查找(二分查找):适用于有序数组,在最坏情况下时间复杂度为O(log n)。 22. 计算机与计算器的区别:计算器是简单的计算设备,而计算机是功能强大的机器,能进行复杂的计算和各种数据处理任务。 23. 进程...

    Java范例开发大全 (源程序)

     实例213 二分查找法的实现方法 377  实例214 模拟操作系统的进程调度 379  实例215 利用栈将字符串逆序输出 381  实例216 动态的数组链表 382  实例217 你能猜出鱼是谁的宠物吗? 387  实例218 使用...

    java范例开发大全(pdf&源码)

    实例213 二分查找法的实现方法 377 实例214 模拟操作系统的进程调度 379 实例215 利用栈将字符串逆序输出 381 实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对List的...

    java范例开发大全源代码

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置...

    java范例开发大全

    实例213 二分查找法的实现方法 377 实例214 模拟操作系统的进程调度 379 实例215 利用栈将字符串逆序输出 381 实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对List的...

    Java范例开发大全(全书源程序)

    实例213 二分查找法的实现方法 377 实例214 模拟操作系统的进程调度 379 实例215 利用栈将字符串逆序输出 381 实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对...

    C#语言规范(4.0版本)

    7.5.2.2 第二阶段 144 7.5.2.3 输入类型 144 7.5.2.4 输出类型 145 7.5.2.5 依赖 145 7.5.2.6 输出类型推断 145 7.5.2.7 参数类型显式推断 145 7.5.2.8 精确推断 145 7.5.2.9 下限推断 145 7.5.2.10 上限推断 146 ...

    微软C#语言规范,C#语言教程中文版

    7.5.2.2 第二阶段 144 7.5.2.3 输入类型 144 7.5.2.4 输出类型 145 7.5.2.5 依赖 145 7.5.2.6 输出类型推断 145 7.5.2.7 参数类型显式推断 145 7.5.2.8 精确推断 145 7.5.2.9 下限推断 145 7.5.2.10 上限推断 146 ...

    C#语言规范(2.0,3.0,4.0合集)

    7.5.2.2 第二阶段 144 7.5.2.3 输入类型 144 7.5.2.4 输出类型 145 7.5.2.5 依赖 145 7.5.2.6 输出类型推断 145 7.5.2.7 参数类型显式推断 145 7.5.2.8 精确推断 145 7.5.2.9 下限推断 145 7.5.2.10 上限推断 146 ...

    C#_语言规范_4.0_中文版

    7.5.2.2 第二阶段 144 7.5.2.3 输入类型 144 7.5.2.4 输出类型 145 7.5.2.5 依赖 145 7.5.2.6 输出类型推断 145 7.5.2.7 参数类型显式推断 145 7.5.2.8 精确推断 145 7.5.2.9 下限推断 145 7.5.2.10 上限推断 146 ...

    UNIX DES加密

    当输入6位二进制数时,前两位确定行索引,后四位确定列索引,输出则为该位置上的4位二进制数。这种基于查找表的方式极大地增强了DES的随机性和复杂度。 #### 密钥调度算法 DES使用一个56位的密钥,通过复杂的密钥...

    汇编语言复习提纲

    - **BCD码**:二进制编码的十进制数,用于表示十进制数,每个十进制数占用四位二进制。 #### 7. 8086/8088的CPU结构 8086/8088 CPU具有以下特点: - **微架构**:采用流水线技术提高指令执行效率。 - **总线接口...

    华为编程开发规范与案例

    【案例2.1.6】 第48页 2、注意多出口函数的处理 第49页 【案例2.2.1】 第49页 三、维护类代码问题 第51页 1、 统一枚举类型的使用 第51页 【案例3.1.1】 第51页 2、 注释量至少占代码总量的20% 第51页 【案例3.2.1...

    C#编程经验技巧宝典

    98 &lt;br&gt;0154 格式化输入数据为货币格式 99 &lt;br&gt;0155 如何计算两个整数的乘积 99 &lt;br&gt;0156 如何将二进制数转换为十进制数 100 &lt;br&gt;0157 如何将二进制数转换为八进制数 100 &lt;br&gt;0158 如何将二...

Global site tag (gtag.js) - Google Analytics