当前位置: 首页 >> 程序设计 >> 数据结构和算法 >> 有序表的查找(折半查找)
 

有序表的查找(折半查找)

作者:      来源:http://blog.csdn.net/panqiaomu     发表时间:2007-05-25     浏览次数:      字号:    

/** 折半查找的适用条件:1,有序表,对于无序表,实现需要“预处理”
* 2,限于顺序存储结构,对于线性链表则无法有效地进行查找等操作。
折半查找的原理:确定要查找表的上界,下界,中间值,用给定的键值和中间值比较
* 若想等则返回成功;否则缩小范围,继续比较直至查找成功或者所比较区间大小小于0
* 为止(不存在要查找的键值) ,区间大小要小于0,才表明查找失败 **/
#include<stdlib.h>
//定义存储结构
typedef struct {//表中每一个记录的类型,当然还可以在结构中添加其他的键值;
 int key;
 //......key1,key2,....
}elemType;
typedef struct{
 elemType* init;
 int length;
}SSTable;
//建立一个有序表
int createSTable(SSTable* t, int len){
 int i;
 if(!(t->init = (elemType*) malloc(sizeof(elemType)*len))) 
  return -1;
 t->length = len; 
 printf("输入有序表的序列值:\n");
 for(i = 0; i < t->length; ++i)
  scanf("%d",&t->init[i].key);
}
//在有序表中查找一个key

int BinarySearch(SSTable* t, int key){
    
int low = 0,high = t->length-1,mid;
    
while(low <= high){  //保证区间长度大于或者等于0 
        mid = (low+high)/2;
        
if(t->init[mid].key == key)
            
return mid;
        
else if(t->init[mid].key < key)
            low 
= mid + 1;
        
else
            high 
= mid -1;
        }

    
return -1;  //未查找到key在表中的下标返回-1 
}

//简单测试
int main(void){
 int n,key;
 SSTable t;
 printf("输入要建立的有序表的长度:\n");
 scanf("%d",&n);
 createSTable(&t,n);
 printf("输入要查找的键值key:\n");
 scanf("%d",&key);
 printf("键值key在表中的下标是:%d",BinarySearch(&t,key));
 system("pause");
 return 0;
}
/** 比较:和前面的顺序查找相比,对有序表进行折半查找在查找成功的前提下,对于任意的表长n,当n>50的时候,
* 其平均查找长度(ASL)近似为log(2)[n+1] -1,要比顺序查找的ASL((n+1)/2)高效得多,但是顺序查找对于任意
* 次序的表都适合,而折半查找是必须针对有序表并且不是线性链表。对于无序表,采用折半查找之前,需要
*   排序,根据采用排序算法的不同,此时整个折半查找的时间复杂度需要考虑排序的时间,而不仅仅是折半查找的
* 时间复杂度。*/

责任编辑 webmaster

 
 
 
 
 
评论更多>>
 
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •