二分查找
来源:互联网 发布:python 2.x.msi 编辑:程序博客网 时间:2024/06/14 03:35
基本思想
二分查找算法是给出一列按序排列的数字,找到指定的数字。我们用一个例子来举例。0,1,2,3,4,5,6,7,8,9找到数字7。首先定义两个指针index1和index2分别指向数组的头和尾。每次讲index1和index2的数组下标向下取半得到的那个数与目标数对比,若是递增数列当取半的下标数比目标数小将index1指向取半下标,若比目标数大则将index2指向取半下标。若为递减则相反。
- 将index1和index2的数组下标向下取半得到下标为4,指向4的数比7小,将index1指向下标4。
- 继续取半得到下标6,比7小将index1指向下标6。
- 继续取半得到下标7,指向的数是7,找到这个数。
下面我们来看一道延伸的例题。
例题
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。现在给出一个递增的数组的一个旋转,找到该数组中最小的数{4,5,6,7,8,1,2,3}。
首先我们要知道该旋转数组有两个递增序列,第二个递增数列的第一个数即为最小数。
- 定义两个指针index1和index2,分别指向数组的头0和尾7。取半 得到下标为3的元素7,7比最后一个元素3大,说明7在第一个递增序列里,将index1指向下标3。
- 继续取半得到下标为5的元素1,1比3小说明1在第二个递增数列里。将index2指向下标5。
- 继续取半的到下标为4的元素8,8比3大说明在第一个递增数列里,而8与1的下标只差1,所以8为第一个递增数列的最大数儿后面的1即为最小数。
代码
#include<stdio.h>int main(){ int length;//数组长度 int a[100]; int index1,index2,index; printf("请输入数组的长度:"); scanf("%d",&length); printf("请输入数组中的元素:"); for(int i=0;i<length;i++) scanf("%d",&a[i]); index1=0; index2=length-1; if(a[index1]<a[index2])//当数组的前0个数旋转时,第一个数即为最小数 printf("最小数是%d",a[index1]); else { while(index2-index1>1) { index=(index1+index2)/2; if(a[index]>a[length-1]) index1=index; else index2=index; } printf("最小数是%d",a[index2]); } return 0;}
截图
0 0
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 二分查找
- 面向对象思想
- identifier of an instance of com.you.hibernate.model.TStudentInfo was altered from 6 to 7
- 进程间通信——共享内存
- 开放才能进步!Angular和Wijmo一起走过的日子
- socket自定义数据格式转化二进制
- 二分查找
- HDU1023_Train Problem II_卡特兰数
- 解决AndroidStudio添加ProjectLibary后在编译时遇到的各种问题之解决方式索引(finished with non-zero exit value and so on...)
- 关于开发项目遇到的问题和错误
- IntelliJ Idea 常用快捷键列表
- PAT-B 1016. 部分A+B (15)
- 蓝桥杯——递归二:典型递归模型(2017.2.20)
- omnet++ Simulation terminated with exit code: -1073741819 的一个解决方案
- java中this用法和javascript中的this用法