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. Aho-Corasick算法实现(简单关键字过滤)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  2. java中String和StringBuffer的区别

    前言 String和StringBuffer本质上都是修饰字符串的只是含义不同 StringBuffer叫做字符串缓冲区 首先看下string类的例子 public class Work1 { pub ...

  3. [转]搭建Hadoop伪分布式环境

    https://my.oschina.net/MyHeaven1987/blog/1821509 http://hadoop.apache.org/docs/current/hadoop-projec ...

  4. [转]Java Web笔记:搭建环境和项目配置(MyEclipse 2014 + Maven + Tomcat)

    来源:http://www.jianshu.com/p/56caa738506a 0. 绪言 Java Web开发中,除了基础知识外,开发环境搭建,也是一项基本功.开发环境包括了IDE.项目管理.项目 ...

  5. 关于mac远程链接window服务器以及实现共享文件

    要最近换了新电脑mac 虽然运行速度666  但是真的很多地方都使用不习惯 这里记录一下 关于 远程链接window主机的问题 方便以后用 首先是 链接: 在应用里 找到    然后类似于  wind ...

  6. P1892 [BOI2003]团伙 并查集

    题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友. 两个强盗是同一团伙的 ...

  7. Leading and Trailing(巧妙利用log解决次方问题)

    Sample Input 5 123456 1 123456 2 2 31 2 32 29 8751919 Sample Output Case 1: 123 456 Case 2: 152 936 ...

  8. HDU 3966 Aragorn's Story(模板题)【树链剖分】+【线段树】

    <题目链接> 题目大意: 给定一颗带点权的树,进行两种操作,一是给定树上一段路径,对其上每个点的点权增加或者减少一个数,二是对某个编号点的点权进行查询. 解题分析: 树链剖分的模板题,还不 ...

  9. vsftpd中配置文件详解

    在vsftp服务器中,配置文件/etc/vsftpd/vsftpd.conf文件是配置的核心内容,其具体的配置信息详细情况如下: 1.默认配置: 1>允许匿名用户和本地用户登陆. anonymo ...

  10. Windows下的Hadoop安装(本地模式)

    时隔许久的博客.. 系统为Windows 10,Hadoop版本2.8.3. 虽然之前已经在Linux虚拟机上成功运行了Hadoop,但我还是在Windows上编码更加习惯,所以尝试了在Window上 ...