二分查找

二分查找

算法思路
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.

二分查找的数列必须是已经有序排列的!

时间复杂度
时间复杂度无非就是while循环的次数!
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
 所以时间复杂度可以表示O(h)=O(log2n)

代码
int low=0,high=array.Length-1,mid;  
int x = int.Parse (Console.ReadLine ());  
    do{  
        mid=(low+high)/2;  
        if(array[mid]==x)  
        {  
            Console.WriteLine ("index= {0}",mid);  
            break;  
        }  
            else if(array[mid]>x) high=mid-1;  
            else low=mid+1;  
        }while(low<=high);  
    if(low>high)  
    Console.WriteLine ("没找到{0}!",x); 


递归
using System;  
  
namespace BinarySearch  
{  
    class MainClass  
    {  
        public static void Main (string[] args)  
        {  
            Console.Write ("请输入您要二分查找的从小到大排序的整型数列的长度: ");  
            int n = int.Parse (Console.ReadLine ());  
            int[] tobeSearch = new int[n];  
            Console.WriteLine ("请输入{0}个待查找的整数(输入一个敲一次回车): ",n);  
            for (int i = 0; i < n; i++)   
            {  
                tobeSearch [i] = int.Parse (Console.ReadLine ());  
            }  
            Console.Write ("查找数列为: ");  
            print (tobeSearch);  
            Console.Write ("请输入要查找的数:  ");  
            int x = int.Parse (Console.ReadLine ());  
            int ind = BinarySearch (tobeSearch,x,0,tobeSearch.Length-1);  
            if(ind == -1)  
                Console.WriteLine ("Sorry,没有找到.");  
            else  
                Console.Write ("找到了,要查找的数的index是{0}\t",ind);  
  
        }  
 
        public static int BinarySearch(int[] arr,int x,int low,int high)  
        {     
            if (low > high) return -1;  
            int mid=(low+high)/2;  
            if (arr [mid] == x)  
                return mid;  
            if (arr [mid] > x)  
                return BinarySearch (arr,x,low, mid - 1);  
            else  
                return BinarySearch (arr,x,mid + 1, high);  
        }  
  
        public static void print(int[] arr){  
            foreach (int num in arr) {  
                Console.Write ("{0} ",num);  
            }  
            Console.WriteLine ();  
        }  
    }  
}  







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值