Spiga
Posts - 35, Articles - 22, Comments - 403
Cnblogs
Dashboard
Login
Home
Contact
Gallery
RSS
Gear.Turbo
Gear, Turbo我喜欢的两个词,代表了我理想中做事情的方式。
C#二分查找
2007-01-11 17:40 by lsp, 1623 visits,
收藏
,
编辑
二分递归查找,很简单,就不注释了: )
using
System;
class
BinarySearch
{
public
int
search(
int
[] A,
int
p,
int
q,
int
key)
{
int
result
=
-
1
;
if
(p
>=
q
&&
key
==
A[p])
{
result
=
p;
}
else
{
int
k
=
(p
+
q)
/
2
;
if
(key
==
A[k])
result
=
k;
else
result
=
(key
<
A[k])
?
search(A, p, k
-
1
, key) : search(A, k
+
1
, q, key);
}
return
result;
}
}
class
Program
{
public
static
void
Main()
{
Random rnd
=
new
Random();
int
[] data
=
new
int
[
10
];
for
(
int
i
=
0
; i
<
10
; i
++
)
{
data[i]
=
i;
Console.Write(
"
{0}\t
"
,data[i]);
}
Console.WriteLine();
BinarySearch s
=
new
BinarySearch();
int
t
=
s.search(data,
0
,
9
,
5
);
Console.Write(t);
}
}
绿色通道:
好文要顶
关注我
收藏该文
与我联系
Categories:
算法&数据结构
Add your comment
6 条回复
2099506
#1楼
cao[未注册用户]
2007-06-21 18:59
你这个递归二分查找好象有点问题
这块少一个是否超出边界的判断
result = (key < A[k]) ? search(A, p, k-1, key) : search(A, k+1, q, key);
看看下面这段是否会清楚一些
public int recursiveSearch(int[] source, int p, int r, int key){
int result = -1;
int left = p;
int right = r;
int q = p + (r-p)/2;
if (source[q] == key)
return result = q;
else {
if (source[q] < key)
left = q +1;
else
right = q -1;
if (left <= right)
result = recursiveSearch(source,left,right,key);
}
return result;
}
回复
引用
#2楼
lsp[未注册用户]
2007-06-21 20:06
恩,这位仁兄算法确实比我写的好,我写的程序是没有错的,边界判断是有的,那就是if (p >= q && key == A[p])这一句,不过还是您的思路更清晰啊!另外您程序里的int q = p + (r-p)/2; 这一句,其实完全等价int q = (p+r)/2;的,呵呵。
回复
引用
#3楼
elzero
2007-12-13 14:26
递归的话函数调用是有开销的,而且递归的次数受堆栈大小的限制。
递归虽然容易理解,但循环比递归效率高,二分不是为了性能?所以我觉得用循环比较好
static int Search(int[] arr, int key)
{
int left = 0;
int right = arr.Length - 1;
while (left <= right)
{
int middle = (left + right) / 2;
if (key == arr[middle]) return middle;
if (key > arr[middle])
left = middle + 1;
else
right = middle - 1;
}
return -1;
}
回复
引用
查看
#4楼
jijianxiang[未注册用户]
2009-05-04 21:17
当要找的数大于数组中最大值时,会出现k + 1 > q, key == A[p]数组越界, if (p >= q && key == A[p]) ???
回复
引用
#5楼
菜叶
2010-01-28 21:36
int Search(int[] source,int key)
{
int left=0;
int right = source.Length-1;
while(left<=right){
int middle = (left+right)/2;
if(source[middle]==key){
return middle;
}
if(source[middle]>key){
left = middle+1;
}else{
right = middle-1;
}
return -1;
}
}
回复
引用
查看
#6楼
Ahriman
2011-05-17 22:25
如果要查的数不在数组里,你这个方法会返回什么?还是会出现bug?
比如测试用例{1,3,5,6,7,8,9}里面找4
回复
引用
查看
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
一淘网收购比价插件“购物助手” 更名“如意淘”
·
Python对软件开发人员很重要?
·
LG首款Windows Phone 7.5手机Miracle谍照
·
Android与iOS:谁更适合HTML 5?
·
硅谷创业者:应用数据采集许可弹窗或适得其反
»
更多新闻...
最新知识库文章
:
·
像设计Web程序那样设计建筑
·
向Google学习打造灵动的web体验
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
About
建设中...
昵称:
lsp
园龄:
5年1个月
粉丝:
3
关注:
1
最新随笔
解析命令行的正则表达式
你是如何让函数返回IEnumerable<T>的
对C#和C++0x中Lamda表达式的简略对比
对C++和C#中多态及类型转换的理解(二)
对C++和C#中多态及类型转换的理解(一)
查看C#代码的低版本实现
Closure中关于递归的一点补充
对Closure的再思考
Tools in Visual Studio 2010
旋转的女郎
最新评论
Re:c#二叉树
俺也是自学的。 -- 秋色
Re:C#二分查找
如果要查的数不在数组里,你这个方法会返回什么?还是会出现bug?
比如测试用例{1,3,5,6,7,8,9}里面找4 -- Ahriman
Re:为什么建议使用多重using
哥们,我真的很佩服你,我一直想不明白你是怎么找到这个方法的,我也一直怀疑这方法的可行性,直到我新自测试了下,reflector里看到的他们是一样一样的,太谢谢了 -- yongfa365
Re:C#冒泡排序
@
左右期限
哥们,祝你好运!说实话,这篇也是当初我准备面试临时补习的。毕竟不是学计算机的,只能一点一点的补。 -- lsp
Re:C#冒泡排序
谢谢 一会面试要用到 -- 左右期限
日历
<
2012年2月
>
日
一
二
三
四
五
六
29
30
31
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
1
2
3
4
5
6
7
8
9
10
随笔分类
随笔档案
2011年8月(2)
2011年6月(1)
2010年1月(12)
2009年12月(2)
2009年9月(1)
2008年8月(2)
2008年7月(1)
2007年4月(1)
2007年3月(2)
2006年12月(11)
推荐排行榜
阅读排行榜
正在阅读