二分法查找

http://baike.baidu.com/link?url=AAw3zskmXDYV1yl8VrsN1v51oCYrUQa00WWR2GA6gULwAloSdMBDFVqS3S1MwqlLEvirY4Pndh56aM3qtJhf4Kphp

 

 

1算法編輯

假若有一組數爲3,12,24,36,55,68,75,88要查給定的值24.可設三個變量front,mid,end分別指向數據的 上界,中間和下界,mid=(front+end)/2.
1.開始令front=0(指向3),end=7(指向88),則mid=3(指向36)。由於mid>x,故應在前半段中查找。
2.令新的end=mid-1=2,而front=0不變,則新的mid=1。此時x>mid,故肯定應在後半段中查找。
3.令新的front=mid+1=2,而end=2不變,則新的mid=2,此時a[mid]=x,查找成功。
若是要查找的數不是數列中的數,例如x=25,當第三次判斷時,x>a[mid],按以上規律,令front=mid+1,即front=3,出現front>end的狀況,表示查找不成功。
例:在有序的有N個元素的 數組中查找用戶輸進去的數據x。
算法以下:
1.肯定查找範圍front=0,end=N-1,計算中項mid=(front+end)/2。
2.若a[mid]=x或front>=end,則結束查找;不然,向下繼續。
3.若a[mid]<x,說明待查找的元素值只可能在比中項元素大的範圍內,則把mid+1的值賦給front,並從新計算mid,轉去執行步驟2;若a[mid]>x,說明待查找的元素值只可能在比中項元素小的範圍內,則把mid-1的值賦給end,並從新計算mid,轉去執行步驟2。
[一維 數組,折半查找]

2算法複雜度分析編輯

時間複雜度

  1. 1.最壞狀況查找最後一個元素(或者第一個元素)Master定理T(n)=T(n/2)+O(1)因此T(n)=O(logn)
    2.最好狀況查找中間元素O(1)查找的元素即爲中間元素(奇數長度數列的正中間,偶數長度數列的中間靠左的元素)

空間複雜度:

  1. S(n)=n

3java代碼編輯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public  class  BubbleTest
{
public  static  int  binary( int [] array,  int  value)
{
int  low =  0 ;
int  high = array.length -  1 ;
while (low <= high)
{
int  middle = (low + high) /  2 ;
if (value == array[middle])
{
return  middle;
}
if (value > array[middle])
{
low = middle +  1 ;
}
if (value < array[middle])
{
high = middle -  1 ;
}
}
return  - 1 ;
}
public  static  void  main(String[] args)
{
int [] a = { 1 2 3 4 5 6 7 8 9 };
int  value = binary(a,  9 );
System.out.println(value);
}
}

4C代碼編輯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
//遞歸算法
int  recurbinary( int  *a, int  key, int  low, int  high)
{
int  mid;
if (low > high)
return  -1;
mid = (low + high)/2;
if (a[mid] == key)  return  mid;
else  if (a[mid] > key)
return  recurbinary(a,key,low,mid -1);
else
return  recurbinary(a,key,mid + 1,high);
}
//非遞歸算法
int  binary(  int  *a,  int  key,  int  n )
{
int  left = 0, right = n - 1, mid = 0;
mid = ( left + right ) / 2;
while ( left < right && a[mid] != key )
{
if ( a[mid] < key )
left = mid + 1;
else  if ( a[mid] > key )
right = mid - 1;
mid = ( left + right ) / 2;
}
if ( a[mid] == key )
return  mid;
return  -1;
}
int  main()
{
int  a[] = {1,2,3,4,5,6,7,8,9,12,13,45,67,89,99,101,111,123,134,565,677};
int  b[] = { 677, 1, 7, 11, 67 };
int  i;
for ( i=0; i< sizeof (b)/ sizeof (b[0]); i++ )
{
printf "%d\n" , recurbinary(a,99,0, sizeof (a)/ sizeof (a[0])-1) );
//printf( "%d\n", binary( a, 45, sizeof(a)/sizeof(a[0])));
}
return  0;
}

5C++代碼編輯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<iostream>
#define N 10
using  namespace  std;
int  main()
{
int  a[N],front,end,mid,x,i;
cout<< "請輸入已排好序的a數組元素:" <<endl;
for (i=0;i<N;i++)
cin>>a[i];
cout<< "請輸入待查找的數x:" <<endl;
cin>>x;
front=0;
end=N-1;
mid=(front+end)/2;
while (front<end&&a[mid]!=x)
{
if (a[mid]<x)front=mid+1;
if (a[mid]>x)end=mid-1;
mid=(front+end)/2;
}
if (a[mid]!=x)
printf ( "沒找到!\n" );
else
printf ( "找到了,在第%d項裏" ,mid+1);
return  0;
}
pascal代碼
function found(a,b,c:longint):longint;
var d,e:longint;
begin
d:=(a+b)  div  2;
if  m[d]=c then found:=d{找到了數字所在位置}
else  if  m[d]<c then  if  (d+1)>b then found:=0{代表不在數列之中}
else  found:=found(d+1,b,c){查找比m[d]大的數}
else  if  (d-1)<a then found:=0
else  found:=found(a,d-1,c){查找比m[d]小的數};
end;

6php代碼編輯

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
functionbinarySearch( $array , $val ){
$count = $array ();
$low =0;
$high = $count -1;
while ( $low <= $high ){
$mid = intval (( $low + $high )/2);
if ( $mid == $val ){
return $mid ;
}
if ( $mid < $val ){
$low = $mid +1;
} else {
$high = $mid -1;
}
}
returnfalse;
}
?>
相關文章
相關標籤/搜索