Chinaunix首页 | 论坛 | 博客
  • 博客访问: 50932
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 62
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-09 10:03
个人简介

c,c++

文章分类

全部博文(13)

文章存档

2018年(1)

2016年(2)

2015年(10)

我的朋友

分类: C/C++

2015-12-25 10:30:26

    二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半部搜索x.

    二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

    看了一下《专家编程》,在数组边界计算方面觉得自己有些不太弄得清楚,于是按照自己的理解写了这个简单的二分查找算法,测试可行。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. #define MAX 8    // 默认数组长度为8,按照从小到大顺序排列

  5. typedef int INT32;
  6. typedef unsigned char UCHAR;

    点击(此处)折叠或打开

    1. #include <stdio.h>
    2. #include <string.h>
    3. #include <stdlib.h>

    4. #define MAX 8

    5. typedef int INT32;
    6. typedef unsigned char UCHAR;

    7. INT32 *Half_Search( INT32 *array, INT32 size, INT32 value )
    8. {
    9.     INT32 i, start = 0, mid, end = size - 1;
    10.     static INT32 *p = NULL;
    11.     
    12.     if( size <= 0 )
    13.     {
    14.         printf( "The array is empty!\n" );
    15.     }
    16.     while( start <= end )
    17.     {
    18.         mid = start + ( end - start )/2;

    19.         if( value == array[mid] )
    20.         {
    21.             return ( p = &array[mid] );
    22.         }
    23.         else if( value < array[mid] )
    24.         {
    25.             end = mid - 1;
    26.         }
    27.         else
    28.         {
    29.             start = mid + 1;
    30.         }

    31.     }
    32.     return NULL;
    33. }
    34. int main()
    35. {
    36.     INT32 *pResult = NULL;
    37.     INT32 array[MAX] = {0};
    38.     INT32 i = 0;
    39.     UCHAR *tmp[MAX] = {""}, str[256] = "";
    40.     INT32 ser_value;

    41.     printf( "Input %d numbers with seprator ',' to create a array :\n", MAX );

    42.     fgets( str, sizeof(str), stdin );
    43.     str[strlen(str)-1] = '\0'; // change the end charactor '\n' to '\0'
    44.     tmp[i] = strtok( str, "," );
    45.     
    46.     while( NULL != tmp[i] )
    47.     {
    48.         array[i] = atoi( tmp[i] );
    49.         
    50.         if( MAX-1 == i ) // only save MAX number into the array
    51.         {
    52.             break;
    53.         }
    54.         tmp[++i] = strtok( NULL, "," );
    55.     
    56.     }
    57.      
    58.     printf( "Input the number you want to search in the array: " );
    59.     for( i = 0; i < MAX; i++ )
    60.     {
    61.      printf( "%d ", array[i] );
    62.     }
    63.     printf( "\nand Input 'quit' to quit search!\n" );
    64.     
    65.     while(1)
    66.     {
    67.        fgets( str, sizeof(str), stdin );
    68.      str[strlen(str)-1] = '\0';
    69.      if( 0 == strcmp( str, "quit" ) )
    70.         {
    71.             break;
    72.         }
    73.      ser_value = atoi( str );
    74.        memset( str, 0, sizeof(str) );
    75.      pResult = Half_Search( array, sizeof(array)/sizeof(int), ser_value );
    76.     
    77.      if( NULL == pResult )
    78.      {
    79.          printf( "Can not find the given number in array!\n");
    80.      }
    81.      else
    82.      {
    83.          printf( "The number %d is in the array! location is %d\n", *pResult,  pResult - array );
    84.      }
    85.     }
    86.     return 0;
    87. }

阅读(1789) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~