设为首页 加入收藏

TOP

查找系列之简述顺序查找和二分查找
2015-07-24 05:43:10 来源: 作者: 【 】 浏览:5
Tags:查找 系列 简述 顺序 二分

顺序查找和二分查找

一、顺序查找思想

1、 从表的一端开始扫描,顺序扫描线性表,依次扫描到的结点关键字与给定的值K相比较.如果当前扫描到的结点的关键字与给定的值K相等,则查找成功;若扫描结束后,仍未找到关键字与给定的值K相等,则查找失败;

2、顺序查找既适用于顺序存储结构,也适用于线性表的链式存储结构;

3、ASL= (n+1)/2为其平均查找长度

4、优点:算法简单,对存储结构形式没有要求 缺点:浪费空间,当长度非常大是效率低

5、算法描述:

/**
*顺序查找
*@param int a[] 表示查找的库
*@param int length 表示数组a的长度
*@param int key 表示需要查找的目标对象
*@return  int
*/
int orderSerch(int a[],int length,int key){
	int count = 0;
	if(key >a[length-1]){
	      cout<<"您输入的元素不存在!"<
  
   a[i] ){
			count++;
		    i++;    
		}else if(key == a[i]){
			cout<<"顺利查到了,查找成功!"<
   
    二、二分查找基本思想 
    

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

折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x a[n/2],则我们只要在数组a的右 半部继续搜索x。这些都是从百度文库copy过来的只是便于理解,由于此算法太简单了,这里就不多说了。

贴上代码:

/**
*二分查找
*@param int a[] 表示查找的库
*@param int length 表示数组a的长度
*@param int key 表示需要查找的目标对象
*@return  int
*/
int BinarySerch(int a[],int length ,int key){
	     int count = 0;
	     if(key >a[length-1]){
	           cout<<"您输入的元素不存在!"<
     
       key ){
			         high = mid-1;
			  }
		 }
		 if(high == mid&& a[mid] != key ){
			   cout<<"查找次数:"<
      
       贴上全部代码:这里我把顺序查找和二分查找弄在了一起,很便于观察和学习,而且使用快排来进行排序,对于向我这样的初学者是一个完整的可学习的代码。 
       

#include
        
         
#include
         
           #include<
          windows.h> using namespace std; int recode[2]={0}; //快速排序以递归实现的代码 void QKSort(int a[],int low,int high) { if(low>=high) { return; } int i = low; int j = high; int key = a[low]; while(i != j){ for(;j != i;j--){ if(a[j] <= key ){ a[i] = a[j]; break; } } for(;i != j;i++){ if(a[i] > key){ a[j] = a[i]; break; } } } a[i]=key; QKSort(a,low,i-1); QKSort(a,j+1,high); } /** *顺序查找 *@param int a[] 表示查找的库 *@param int length 表示数组a的长度 *@param int key 表示需要查找的目标对象 *@return int */ int orderSerch(int a[],int length,int key){ int count = 0; if(key >a[length-1]){ cout<<"您输入的元素不存在!"<
          
           a[i] ){ count++; i++; }else if(key == a[i]){ cout<<"顺利查到了,查找成功!"<
           
            a[length-1]){ cout<<"您输入的元素不存在!"<
            
              key ){ high = mid-1; } } if(high == mid&& a[mid] != key ){ cout<<"查找次数:"<
             
              >input; if(input <0||input >3){ cout<<"请重新选择:"<
              
               4){ system("CLS"); operation(a,length); count1= 0; } switch(input){ case 1:cout<<"进行的是二分查找---"<
               
                >key;BinarySerch(a,length,key);cout<<"请选择是否继续操作:Y/N"<
                
                 >c; if(c =='Y'||c=='y'){operation(a,length);}else if(c=='N'||c=='n'){return ;}else{cout<<"输入选择有误!"<
                 
                  >key;orderSerch(a,length,key);cout<<"请选择是否继续操作:Y/N"<
                  
                   >c; if(c =='Y'||c=='y'){operation(a,length);}else if(c=='N'||c=='n'){return ;}else{cout<<"输入选择有误!"<
                   
                    >c; if(c =='Y'||c=='y'){operation(a,length);}else if(c=='N'||c=='n'){return ;}else{cout<<"输入选择有误!"<
                    
                     代码经验证过!
                     

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 2528 Mayor's posters 线.. 下一篇NYOJ 264 国王的魔镜

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: