1. 二分法查找

  前提: 数据是排好序的。

  题设:给出一个有序arr,从中找出key,arr的区间是array[ low , higt].

  步骤:

  (1)mid=(low+high)/2

  (2)array[mid]与key 比较,若相等,返回mid。

  (3)if array[mid]>key,则在arryay[low,mid-1]查找

      if array[mid]<key,则在array[mid+1,higt]查找

  (4)重复(1)(2)(3)

2. 题目:用js实现二分法查找。要求:从浏览器中输入一个无序的数组以及一个需要查找的数字,输出要查找数字在排序后的数字中的位置。

    以下程序大体实现了该功能,有些还没有完善。

    需要注意的有以下几点:

    (1)在浏览器输入1,2,0,3,10 后,实际上存储的是一个字符串“1,2,0,3,10”,所以需要使用split()将其转换为字符串数组:[“1”,“2”,“0”,“3”,“10”]

         (2)使用map(function(data){return +data;})对每一个元素进行类型转换,将字符串数组转换为整型数组。

      (3)不能使用sort()直接对数组进行排序,要结合campare函数。

    (4)parseInt()将数组的字符串转换为整型。

    (5)Math.floor()向下取整。

    (6) 当要查找的数字不是输入数组中包含,会出现以下错误:

  

  所以进行:if(data==key)判断。

    

 var arr = prompt("请输入一个数组(以“,”隔开):").split(",").map(function(data){
return +data;}).sort(compare);
console.log("输入的数组,排序后是:"+arr); var key=parseInt(prompt("请输入一个要查找的数字:"));
console.log("要查找的数字是:"+key); var low=0,high=arr.length-1,mid; arr.map(function(data){
if(data==key){
console.log("您要查找的数字排在第 "+fun(arr,key,low,high)+" 位");
}
}) function compare(value1,value2){
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else{
return 0;
}
} function fun(arr,key,low,high){
mid=Math.floor((low+high)/2);
if(arr[mid]==key){
return mid;
}else if(arr[mid]<key){
low=mid+1;
return fun(arr,key,low,high);
}else{
high=mid-1;
return fun(arr,key,low,high);
}
}

  C语言(递归)

 #include <stdio.h>
#include <malloc.h>
int BinarySearch(int arr[], int key, int low, int high){
int mid = (low + high) / ;
if(key == arr[mid]){
printf("The index of the key is: %d\n",mid);
}else if(key > arr[mid]){
low = mid + ;
BinarySearch(arr, key, low, high);
}else{
high = mid - ;
BinarySearch(arr, key, low, high);
} return ;
}
int main(){
int len, i, *arr, key;
printf("The length is: ");
scanf("%d", &len);
arr = (int*)malloc(sizeof(int)*len);
printf("Please enter an ordered array: ");
for(i=; i<len; i++){
scanf("%d",&arr[i]);
}
printf("Please enter the number you want to find:");
scanf("%d",&key);
BinarySearch(arr, key, , len-);
return ;
}

  C语言

 #include <stdio.h>
#include <malloc.h>
int BinarySearch(int arr[], int key, int low, int high){
while(low <= high){
int mid = (low +high) / ;
if(key > arr[mid]){
low = mid + ;
}else if(key < arr[mid]){
high = mid + ;
}else{
return mid;
}
} return -;
}
int main(){
int len, i, *arr, key, res;
printf("The length is: ");
scanf("%d", &len);
arr = (int*)malloc(sizeof(int)*len);
printf("Please enter an ordered array: ");
for(i=; i<len; i++){
scanf("%d",&arr[i]);
}
printf("Please enter the number you want to find:");
scanf("%d",&key);
res = BinarySearch(arr, key, , len-);
if(res < ){
printf("The key is no in array! \n");
}else{
printf("The index of the key is: %d\n",res);
}
return ;
}

C/JS_二分法查找的更多相关文章

  1. 使用二分法查找mobile文件中区号归属地

    #!/usr/bin/env python #coding:utf-8 ''' Created on 2015年12月8日 @author: DL @Description: 使用二分法查找mobil ...

  2. js冒泡排序与二分法查找

    冒泡排序 var attr=[1,5,7,6,3,9,2,8,4]; var zj=0; //控制比较轮数 for(var i=0;i<attr.length-1;i++) { //控制每轮的比 ...

  3. Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)

    一.概念 二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法. 二.算法思想 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者 ...

  4. C语言的算法--------二分法查找

    int find(int n,int a[],int l){int low=0;int high=l-1;int middle=0;while(low<high){middle=(low+hig ...

  5. JavaScript用二分法查找数据等

    //二分法查数据 var arr=[41,43,45,53,44,95,23]; var b=44; var min=0; var max=arr.length; for(var i=1;i<a ...

  6. Python二分法查找及变种分析

    基于Python3 普通二分法查找目标值的index 二分法查找的思路很简单,先确定好列表nums的一头start一尾end,中间值middle根据头尾数值之和用地板除法除以2,即(start + e ...

  7. C#实现二分法查找算法

    /// <summary> /// 二分法查找 /// </summary> /// <param name="arr"></param& ...

  8. python3 二分法查找

    '''二分法查找有序列表掐头去尾取中间查找列表中xx在不在列表中,在,则返回索引值'''# lst = [1, 4, 6, 8, 9, 21, 23, 26, 35, 48, 49, 54, 67, ...

  9. day17递归函数(二分法查找)

    递归函数: 如果函数包含了对其自身的调用,该函数就是递归的: example 1:二分法查找的实现: def find_recursion(l,aim,start=0,end=None): #end不 ...

随机推荐

  1. uva 11367 (Dijkstra+DP)

    题意:一辆汽车在一张无向图中开告诉你每个城市加油的费用.每次给q个查询(起点,终点,油箱容量)问你最小花费是多少. 思路:一道Dijkstra状态的题目.在这种最短路问题中一维的dis数组记录的信息往 ...

  2. [WC2014]紫荆花之恋

    题解: 首先考虑点分治 dis(i,u)+dis(i,v)<=value[u]+value[v] 移项就很容易发现用平衡树可以很简单的维护这个东西 但是有重复,需要在下一层的每个平衡树内减去这个 ...

  3. 2018牛客网暑假ACM多校训练赛(第四场)E Skyline 线段树 扫描线

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-E.html 题目传送门 - https://www.no ...

  4. BZOJ4589 Hard Nim FWT 快速幂 博弈

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4589.html 题目传送门 - BZOJ4589 题意 有 $n$ 堆石子,每一堆石子的取值为 $2$ ...

  5. 通过mysql-proxy映射外网访问内网数据库

    配置教程: 转自:http://www.centoscn.com/mysql/2015/0107/4437.html centos安装mysql-proxy mysql-proxy的用处就不再说了 m ...

  6. Trident中的解析包含的函数操作与投影操作

    一:函数操作 1.介绍 Tuple本身是不可变的 Function只是在原有的基础上追加新的tuple 2.说明 如果原来的字段是log,flag 新增之后的tuple可以访问这些字段,log,fla ...

  7. json数组,前后端传值问题,与data时间转毫秒

    从json数组到ArrayList Gson gson = new Gson(); Car cars = gson.fromJson(result,new TypeToken<ArrayList ...

  8. MATLAB视频读取转换为图片

    转换mp4到jpg格式的图片: % convert .mp4 to jpg picture t='C:\Documents and Settings\luokh\桌面\Matlab编程\Matlab编 ...

  9. jenkins创建svn项目自动部署

    Exec command ; cd /home/zhxjdk18/server/jenkins_project/owgd_site/admin; rm -rf * ; source .bashrc ; ...

  10. Redis+Shiro+Spring-data-redis,共享Session

    环境:centos7,Java1.8+,一个Nginx,两个Tomcat,一个Redis. 关于共享session的问题大家都应该知道了,传统的部署项目,两个相同的项目部署到不同的服务器上,Nginx ...