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不 ...
随机推荐
- uva 11367 (Dijkstra+DP)
题意:一辆汽车在一张无向图中开告诉你每个城市加油的费用.每次给q个查询(起点,终点,油箱容量)问你最小花费是多少. 思路:一道Dijkstra状态的题目.在这种最短路问题中一维的dis数组记录的信息往 ...
- [WC2014]紫荆花之恋
题解: 首先考虑点分治 dis(i,u)+dis(i,v)<=value[u]+value[v] 移项就很容易发现用平衡树可以很简单的维护这个东西 但是有重复,需要在下一层的每个平衡树内减去这个 ...
- 2018牛客网暑假ACM多校训练赛(第四场)E Skyline 线段树 扫描线
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-E.html 题目传送门 - https://www.no ...
- BZOJ4589 Hard Nim FWT 快速幂 博弈
原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4589.html 题目传送门 - BZOJ4589 题意 有 $n$ 堆石子,每一堆石子的取值为 $2$ ...
- 通过mysql-proxy映射外网访问内网数据库
配置教程: 转自:http://www.centoscn.com/mysql/2015/0107/4437.html centos安装mysql-proxy mysql-proxy的用处就不再说了 m ...
- Trident中的解析包含的函数操作与投影操作
一:函数操作 1.介绍 Tuple本身是不可变的 Function只是在原有的基础上追加新的tuple 2.说明 如果原来的字段是log,flag 新增之后的tuple可以访问这些字段,log,fla ...
- json数组,前后端传值问题,与data时间转毫秒
从json数组到ArrayList Gson gson = new Gson(); Car cars = gson.fromJson(result,new TypeToken<ArrayList ...
- MATLAB视频读取转换为图片
转换mp4到jpg格式的图片: % convert .mp4 to jpg picture t='C:\Documents and Settings\luokh\桌面\Matlab编程\Matlab编 ...
- jenkins创建svn项目自动部署
Exec command ; cd /home/zhxjdk18/server/jenkins_project/owgd_site/admin; rm -rf * ; source .bashrc ; ...
- Redis+Shiro+Spring-data-redis,共享Session
环境:centos7,Java1.8+,一个Nginx,两个Tomcat,一个Redis. 关于共享session的问题大家都应该知道了,传统的部署项目,两个相同的项目部署到不同的服务器上,Nginx ...