算法---二分查找

/*************************************************************************
> File Name: xuanze.c
> Author: bear
> Mail: 1798900899@qq.com 
> Created Time: Wed 11 Mar 2015 08:21:02 PM CST
 ************************************************************************/
#include<stdio.h>




#define N 7




void 
main( void )
{
//init
int data[N] = {23, 56, 8, 90, -7 ,5, 0};
int i;




printf( "the privious data:\n" );
for ( i = 0; i < N; i++ ) {
printf( "%4d", data[i] );
}




printf( "\n" );




//sort
int j = 0;
int temp = 0;




for ( i = 0; i < (N-1); i++ ) 
for( j = 0; j < (N-i-1); j++ ) {

if ( data[j+1] < data[j] ) {
//exchange
temp = data[j+1];
data[j+1] = data[j];
data[j] = temp;
}
}




printf( "\n" );




//print
printf( "after sorted:\n");
for ( i = 0; i < N; i++ ) {
printf( "%4d",data[i] );
}




//find value
int findkey = 0;
printf( "\ninput the finding value:" );
scanf( "%d", &findkey );




/**************************************************************************************************************************************************************
//find 
int left = 0;
int right = N - 1;








int media = 0;

while ( left <= right ) {




media = ( right+left ) / 2;




if ( data[media] > findkey ) {




right = media + 1;     //这样找不到最大值




} else if ( data[media] < findkey ) {




left = media - 1; //这样找不到最小值




} else {
printf( "the findkey:%d.\n", data[media] );
break;
}





***************************************************************************************************************************************************************************************/
















/*
int lower = 0;
int large = 6;
int count = 0;
int middle;
int flag = 0;
while(lower<=large){
count++;
middle = (lower+large)/2;
if(findkey<data[middle]){




large = middle-1; // 移动到中间值前一个




} else if (findkey>data[middle])
  {
lower = middle+1; //移动到中间值后一个
  }
  else{
flag = 1;
printf("查找到数据用了:%d次\n",count);
break;
}
}




if (flag != 1 ){
printf("没找到!");
}
*/

printf("\n");
}




二分法

每次计算中间值
media = (left+right)/2;
**************************************************************************
每次都会进行判断
**************************************************************************
if (data[media]  > findkey )
{
right = media - 1; 
} else if ( data[media] < findkey )
{
left = media + 1;
} else
{
// data[media] = findkey;
}
        **************************************************************************
思考:0,这是一个循环的过程而且没必要一定执行一次
所以考虑使用while()
      1,考虑最差的情况,就是最前面一个或者最后一个,因此当left=right时,
就会出现我们要找的值。
      2,提示信息的打印
a,找到的时候,此时发生在data[media] = findkey的时候
b,没找到的信息只要打印一次,而且还发生在循环之后,并且还是和找到相反

      因此一个方法出现




  大前提提出: if成立
flage = 1;
该情况下应该发生的没发生
  大前提消失:


   if (flage == 1 )
{
相反情况发生
}

好了,一点儿关于二分法的想法,感觉写的很乱!




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值