C/JS_二分法查找
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_二分法查找的更多相关文章
- 使用二分法查找mobile文件中区号归属地
#!/usr/bin/env python #coding:utf-8 ''' Created on 2015年12月8日 @author: DL @Description: 使用二分法查找mobil ...
- js冒泡排序与二分法查找
冒泡排序 var attr=[1,5,7,6,3,9,2,8,4]; var zj=0; //控制比较轮数 for(var i=0;i<attr.length-1;i++) { //控制每轮的比 ...
- Java基础(50):二分法查找的非递归实现和递归实现(完整代码可运行,参考VisualGO理解更佳)
一.概念 二分查找算法也称折半查找,是一种在有序数组中查找某一特定元素的搜索算法. 二.算法思想 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者 ...
- 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 ...
- 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 ...
- Python二分法查找及变种分析
基于Python3 普通二分法查找目标值的index 二分法查找的思路很简单,先确定好列表nums的一头start一尾end,中间值middle根据头尾数值之和用地板除法除以2,即(start + e ...
- C#实现二分法查找算法
/// <summary> /// 二分法查找 /// </summary> /// <param name="arr"></param& ...
- python3 二分法查找
'''二分法查找有序列表掐头去尾取中间查找列表中xx在不在列表中,在,则返回索引值'''# lst = [1, 4, 6, 8, 9, 21, 23, 26, 35, 48, 49, 54, 67, ...
- day17递归函数(二分法查找)
递归函数: 如果函数包含了对其自身的调用,该函数就是递归的: example 1:二分法查找的实现: def find_recursion(l,aim,start=0,end=None): #end不 ...
随机推荐
- Aho-Corasick算法实现(简单关键字过滤)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- java中String和StringBuffer的区别
前言 String和StringBuffer本质上都是修饰字符串的只是含义不同 StringBuffer叫做字符串缓冲区 首先看下string类的例子 public class Work1 { pub ...
- [转]搭建Hadoop伪分布式环境
https://my.oschina.net/MyHeaven1987/blog/1821509 http://hadoop.apache.org/docs/current/hadoop-projec ...
- [转]Java Web笔记:搭建环境和项目配置(MyEclipse 2014 + Maven + Tomcat)
来源:http://www.jianshu.com/p/56caa738506a 0. 绪言 Java Web开发中,除了基础知识外,开发环境搭建,也是一项基本功.开发环境包括了IDE.项目管理.项目 ...
- 关于mac远程链接window服务器以及实现共享文件
要最近换了新电脑mac 虽然运行速度666 但是真的很多地方都使用不习惯 这里记录一下 关于 远程链接window主机的问题 方便以后用 首先是 链接: 在应用里 找到 然后类似于 wind ...
- P1892 [BOI2003]团伙 并查集
题目描述 1920年的芝加哥,出现了一群强盗.如果两个强盗遇上了,那么他们要么是朋友,要么是敌人.而且有一点是肯定的,就是: 我朋友的朋友是我的朋友: 我敌人的敌人也是我的朋友. 两个强盗是同一团伙的 ...
- 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 ...
- HDU 3966 Aragorn's Story(模板题)【树链剖分】+【线段树】
<题目链接> 题目大意: 给定一颗带点权的树,进行两种操作,一是给定树上一段路径,对其上每个点的点权增加或者减少一个数,二是对某个编号点的点权进行查询. 解题分析: 树链剖分的模板题,还不 ...
- vsftpd中配置文件详解
在vsftp服务器中,配置文件/etc/vsftpd/vsftpd.conf文件是配置的核心内容,其具体的配置信息详细情况如下: 1.默认配置: 1>允许匿名用户和本地用户登陆. anonymo ...
- Windows下的Hadoop安装(本地模式)
时隔许久的博客.. 系统为Windows 10,Hadoop版本2.8.3. 虽然之前已经在Linux虚拟机上成功运行了Hadoop,但我还是在Windows上编码更加习惯,所以尝试了在Window上 ...