二分法的C/C++实现

来源:互联网 发布:图书数据 编辑:程序博客网 时间:2024/06/05 22:36

1算法编辑

假如有一组数为312243655687588要查给定的值24.可设三个变量frontmidend分别指向数据的上界,中间和下界,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=0end=N-1,计算中项mid=front+end/2

2.a[mid]=xfront>=end,则结束查找;否则,向下继续。

3.a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给front,并重新计算mid,转去执行步骤2;若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给end,并重新计算mid,转去执行步骤2

[一维数组,折半查找]

2java代码编辑

public class BubbleTest

{

public static int binary(int[] array, intvalue)

{

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);

}

}

3C代码编辑

#include <stdio.h>

//递归算法

int recurbinary(int *a,int key,int low,inthigh)

{

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);

}

//非递归算法[1] 

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;

}

4C++代码编辑

#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;

}

s�C*sd��� �� "bdshare_t log-set-param bds_tools get-codes-bdshare bk_share" data="{'url':'http://baike.baidu.com/view/4126923.htm','text':'【二分法查找_百度百科】算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。主要思想是:(设查找的数组区间为array[low, high])(1)确定该期间的中间位置K(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]&gt;T 由数组的.....(分享自@百度百科)','pic':''}" style="z-index: 999999; padding-bottom: 2px; font-size: 12px; float: left; zoom: 1; text-align: left !important; ">
分享

0 0