二分查找
算法思路
二分查找的基本思想是将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/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 ();
}
}
}
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 ();
}
}
}