二分查找法

二分查找算法的前置条件是,一个已经排序好的序列(在本篇文章中为了说明问题的方便,假设这个序列是升序排列的),这样在查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止.

  1. int BinSearch(SeqList * R, int n , KeyType K )  
  2. {   
  3. //在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1     
  4. int low=0,high=n-1,mid;   
  5. //置当前查找区间上、下界的初值     
  6. if(R[low].key==K)     
  7. {     
  8. return 0 ;     
  9. }     
  10. while(low<=high)  
  11. {   
  12. //当前查找区间R[low..high]非空     
  13. mid=low+((high-low)/2);  
  14. //使用 (low + high) / 2 会有整数溢出的问题     
  15. if(R[mid].key==K)     
  16. {     
  17. return mid; //查找成功返回     
  18. }     
  19. if(R[mid].key>K)     
  20. high=mid-1;   
  21. //继续在R[low..mid-1]中查找     
  22. else     
  23. low=mid+1;   
  24. //继续在R[mid+1..high]中查找     
  25. }     
  26. return -1;   
  27. //当low>high时表示查找区间为空,查找失败     
  28. }   
  29. //BinSeareh  


  1. int BinSearch2(int array[], int n, int v)  
  2. {  
  3.     int left, right, middle;  
  4.   
  5.     left = -1, right = n;  
  6.   
  7.     while (left + 1 != right)  
  8.     {  
  9.         middle = left + (right - left) / 2;  
  10.   
  11.         if (array[middle] < v)  
  12.         {  
  13.             left = middle;  
  14.         }  
  15.         else  
  16.         {  
  17.             right = middle;  
  18.         }  
  19.     }  
  20.   
  21.     if (right >= n || array[right] != v)  
  22.     {  
  23.         right = -1;  
  24.     }  
  25.   
  26.     return right;  
  27. }  


参考资料
1.<<编程珠玑>>
2.wiki上关于二分查找的说明:http://en.wikipedia.org/wiki/Binary_search

  1. int BinSearch1(int r[ ], int n, int k)  
  2. //数组r[1] ~ r[n]存放查找集合  
  3. {   
  4.     low=1; high=n;  
  5.     while (low<=high)                     
  6.     {  
  7.        mid=(low+high)/2;              
  8.        if (k<r[mid])  high=mid-1;  
  9.        else if (k>r[mid])  low=mid+1;   
  10.               else return mid;  
  11.     }  
  12.     return 0;  


  13. http://blog.csdn.net/21aspnet/article/details/1539685
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值