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不 ...
随机推荐
- es6 2017
http://es6.ruanyifeng.com/ 18.async 20.Decorator 属于ES2017, nodejs 未实现 21.Module 中的 import export n ...
- ArcGIS 卷帘效果
一直没注意ArcGIS自带了卷帘功能,使用方法:调出Effects工具条,里面就有卷帘工具. AE开发参考: http://bbs.esrichina-bj.cn/esri/viewthread.ph ...
- 学号:20165239 预备作业3 Linux安装及学习
实验三 用户及文件权限管理 之前从未接触过虚拟机,借着老师布置的任务,这次寒假初次接触了虚拟机,既紧张又兴奋,在学习了老师的一部分教程以及查阅网上的资料之后,有了以下的学习笔记和心得. 一.Linux ...
- python--装饰器2--理解
一.装饰无参函数①.原函数target为无参函数②.装饰函数的内置函数也必须要是无参函数③.运行原理相当于:target()=decorator(target)()---->最后的()相当于执行 ...
- PHPcurl的post/get请求
post/get请求 function getCurl($url,$data=null,$method='post',$https=true){ //1. 初始化 $ch = curl_init(); ...
- BZOJ2821 作诗(Poetize) 主席树 bitset
原文链接https://www.lydsy.com/JudgeOnline/problem.php?id=2821 题目传送门 - BZOJ2821 题意 $n$ 个数,$m$ 组询问,每次问 $[l ...
- .net core webapi 后台获取客户端ip地址
Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法 1.获取客户端IP地址实现方法(扩展类) 1 using Microsoft.AspNetC ...
- .net core cookie登录和session的 DataProtectionProvider 加入 redis
string redisConnectionString = Configuration.GetSection("Storage:Redis").GetValue<strin ...
- Python中元类
元类(metaclass) 简单地说,元类就是一个能创建类的类,而类class 是由type创建的,class可以创建对象 type与object的关系详见:python中type和object 1. ...
- OpenJ_Bailian 4017 爬楼梯
时间限制: 1000 ms 空间限制: 262144 KB 题目描述 树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数.例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一 ...