Spiga

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, 095);
        Console.Write(t);
    }

}
Add your comment

6 条回复

  1. #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. #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. #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. #4楼 jijianxiang[未注册用户]2009-05-04 21:17
    当要找的数大于数组中最大值时,会出现k + 1 > q, key == A[p]数组越界, if (p >= q && key == A[p]) ???
     回复 引用   
  5. #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. #6楼 Ahriman      2011-05-17 22:25
    如果要查的数不在数组里,你这个方法会返回什么?还是会出现bug?
    比如测试用例{1,3,5,6,7,8,9}里面找4
     回复 引用 查看