图解数据结构(4)——二分法查找法

六、二分法查找(Binary Search)

如何从数组里找一个元素的位置?如果排列是无序的,我们只能从头到尾找,但如果排列是有序的,我们则可以用别的更好的方法,二分查找法就类似我们在英汉词典里找一个单词的方法。如下图所示(假如我们要查找的数字是“88”):

下面我给出了一段demo代码,来演示二分查找法比顺序查找快多少,代码为了方便起见,初始化有序表的时候填入的数字都是均匀的,而事实上数字可以不均匀。你可以调整一下代码中TABLE_SIZE的值,从500,调到5000,再调到10000,再调到30000……你会发觉两者差距越来越明显。我在第一篇的地方提到二分查找法的复杂度为Ο(logn),而顺序查找的复杂度为Ο(n),当n越来越大时候,Ο(logn)的优势也就越来越明显,当然了,前提是“有序”,才可用二分查找法。

#include " stdio.h "
#include
" time.h "

#define TABLE_SIZE 50000

// returns the position, -1 means failed.
int SequenceSearch( int * pArray, int iArraySize, int iVal)
{
int i;
for (i = 0 ; i < iArraySize; i ++ )
{
if (pArray[i] == iVal)
return i;
}

return - 1 ;
}

// returns the position, -1 means failed.
int BinarySearch( int * pArray, int iArraySize, int iVal)
{
int iLeft = 0 ;
int iRight = iArraySize - 1 ;
while (iLeft <= iRight)
{
int iMiddle = (iLeft + iRight) / 2 ;
if (iVal < pArray[iMiddle])
{
iRight
= iMiddle - 1 ;
}
else if (iVal > pArray[iMiddle])
{
iLeft
= iMiddle + 1 ;
}
else
return iMiddle;
}

return - 1 ;
}

int main( int argc, char * argv[])
{
// make the table
int table[TABLE_SIZE];
int i;
for (i = 0 ; i < TABLE_SIZE; i ++ )
{
table[i]
= i * 2 ;
}

clock_t ctBegin
= clock();
// Test sequence search
for (i = 0 ; i < TABLE_SIZE; i ++ )
{
SequenceSearch(table, TABLE_SIZE, i
* 2 );
}
clock_t ctEnd
= clock();

printf(
" SequenceSearch takes %d clocks.\n " , ctEnd - ctBegin);

// Test binary search
ctBegin = clock();
for (i = 0 ; i < TABLE_SIZE; i ++ )
{
BinarySearch(table, TABLE_SIZE, i
* 2 );
}
ctEnd
= clock();

printf(
" BinarySearch takes %d clocks.\n " , ctEnd - ctBegin);

return 0 ;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值