> 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" );
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 )
{
相反情況發生
}
好了,一點兒關於二分法的想法,感覺寫的很亂!