折半查找法

题目:

你是一名合格的图书管理员,你必须能够在一排(10000以内)已按编号大小排好序的图书中,
快速地按照编号查找某本书所在的位置

输入格式:

输入第一行是N,表示有N个元素,第二行是N个数,第三行是M表示要查找的数(第二行数字之间用空格隔开且最后一个数字不能有空格)

输出格式:

一个数,如果找到该数则输出位置否则输出-1

输入例子:

3
2 4 6
4

输出例子:

2

实现思路

递归二分算法

将已经排好序的数列依次存入数组arr里面,设查找的数为M,用指针first表示该数列最左端的位置,用指针end表示该数列
最右端的位置,取得first和end的中间值mid指向该数列的最中间位置,
当end>first时,比较M与arr[mid],有3种可能;

  1. 若M=arr[mid],表示找到了,退出查找
  2. 若M<arr[mid],表示需要选择前半段进行查找,first不变,end改变为mid-1
  3. 若M>arr[mid],表示需要选择后半段进行查找,first变成mid+1,end不变
    结束的情况只有两种,找到和未找到,以下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
process.stdin.setEncoding('utf8');
var count = 0;
var i=0;
var arr = [];
var newArr = [];
var m = 0
process.stdin.on('readable', function() {
var chunk = process.stdin.read();
if (chunk !== null) {
arr.push(chunk)
}
if(arr.length!=0){
count = parseInt(arr[0])
if(i>2){
process.stdin.emit('end')
}
}
i++
});
function search(first,end){
var mid = 0;
if(end>=first){
mid = parseInt((first+end)/2);
if(m==newArr[mid-1]){
console.log("总共"+count+"个数");
console.log("位置在:"+mid);
return;
}
else if(m<=newArr[mid-1]){
search(first,mid-1);
}
else{
search(mid+1,end)
}
}
else{
console.log('-1');
}
}
function rev(newArr){
var first = 1;
var end = newArr.length
search(first,end)
}
process.stdin.on('end', function() {
newArr = arr.slice(1,arr.length-1)
m = arr[arr.length-1]
newArr = newArr.join(" ").split(" ").map(function(index, elem) {
return parseInt(index);
})
rev(newArr)
process.stdout.write('end');
});

示例

图片描述

© 2017 RABBIT All Rights Reserved.
Theme by hiero