数据结构之折半查找

数据结构之--折半查找

定义:折半查找技术,也就是二分查找。它的前提是线性表中的记录必须是关键码有序(通常从大到小有序),线性表必须采用顺序存储。折半查找的基本思想是:取中间记录作为比较对象,若给定值与中间记录的关键字,则在中间记录的关键字相等,则查找成功;若给定值小于中间记录的作伴去继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

图解

时间复杂度:由于具有n个节点的完全二叉树的深度为⌊log₂n⌋+1,尽管折半查找判定二叉树并不是完全二叉树,但同样相同的推导可以得出,最坏的情况查找到关键字或者查找失败的次数为⌊log₂n⌋+1。因此我们折半算法的时间复杂度为:O(logn),它显然远远好于顺序查找的O(n)的时间复杂度了。

#include<stdio.h>

int Binary_Search(int *a,int n,int key){

  int low,mid,high;

  low = 1;                      /*定义最低下表为记录首位*/

  high = n;                      /*定义最高下表为记录末位*/

  while(low<=high){

    mid=(low+high)/2;              /*折半*/

    if(key<a[mid])                 /*若查找值比中值小*/

      high=mid-1;                /*最高下标调整到中位下标小一位*/

    else if(key>a[mid])                ​/*若查找值比中值大*/

      low=mid+1;                  ​/*最低下标调整到中值位下标大一位*/

    else

      return mid;                   ​/*若相等说明mid即为查找到的位置*/

  }

  return 0;

}

void main(){

  int num[] = {0,1,16,24,35,47,59,62,73,88,99};

  int result = Binary_Search(num,sizeof(num)/sizeof(num[0])-1,62);

  printf("查找结果为:%d\n",result);

}

运行结果为: 

 

posted @ 2015-08-08 17:41  依凡王子  阅读(9383)  评论(0编辑  收藏  举报