算法---二分查找

/*************************************************************************
> File Name: xuanze.c
> Author: bear
> Mail: [email protected] 
> 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 )
{
相反情況發生
}

好了,一點兒關於二分法的想法,感覺寫的很亂!




發佈了33 篇原創文章 · 獲贊 11 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章