/*************************************************************************
> 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 )
{
相反情况发生
}
好了,一点儿关于二分法的想法,感觉写的很乱!
> 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" );
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 )
{
相反情况发生
}
好了,一点儿关于二分法的想法,感觉写的很乱!