实现有序表二分查找

二分查找递归与非递归

//算法7.3 折半查找

#include<iostream>
using namespace std;
#define MAXSIZE 100
#define OK 1;

typedef struct{
    int key;//关键字域
}ElemType;

typedef struct{
    ElemType *R;
    int length;
}SSTable;

int InitList_SSTable(SSTable &L)
{
    L.R=new ElemType[MAXSIZE];
    if (!L.R)
    {
        cout<<"初始化错误";
        return 0;
    }
    L.length=0;
    return OK;
}

int Insert_SSTable(SSTable &L)
{
    int j=1;
    for(int i=1;i<MAXSIZE;i++)
    {
        L.R[i].key=j;
        L.length++;
        j++;
    }
    return 1;
}

int Search_Bin(SSTable ST,int key) {
   // 在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为
   // 该元素在表中的位置,否则为0
   int low=1,high=ST.length;                            //置查找区间初值
   int  mid;
   while(low<=high) {
       mid=(low+high) / 2;
      if (key==ST.R[mid].key)  return mid;              //找到待查元素
      else if (key<ST.R[mid].key)  high = mid -1;       //继续在前一子表进行查找
      else  low =mid +1;                                //继续在后一子表进行查找
   }//while
   return 0;                                        //表中不存在待查元素
}// Search_Bin
int Search_Bin2(SSTable ST,int key,int low,int high) {
   // 递归折半查找                            //置查找区间初值
   int  mid;
   if(low>high){
     return 0;
   }
   //while(low<=high) {
      mid=(low+high) / 2;
      if (key==ST.R[mid].key)  return mid;              //找到待查元素
      else if (key<ST.R[mid].key)  return Search_Bin2(ST,key,low,mid-1);        //继续在前一子表进行查找
      else return Search_Bin2(ST,key,mid+1,high);  

      //继续在后一子表进行查找
   //}//while

}// Search_Bin

void Show_End(int result,int testkey)
{
    if(result==0)
        cout<<"未找到"<<testkey<<endl;
    else
        cout<<"找到"<<testkey<<"位置为"<<result<<endl;
    return;
}

int main()
{
    SSTable ST;
    int low=1;
    InitList_SSTable(ST);
    Insert_SSTable(ST);
    int high=ST.length;
    int testkey1=8,testkey2=200;
    int result;
    cout<<"输入查找的数"<<endl;

    //cin>>testkey1>>testkey2;

    cout<<"非递归折半查找"<<endl;
    cout<<""<<endl;
    result=Search_Bin(ST, testkey1);
    Show_End(result,testkey1);
    result=Search_Bin(ST, testkey2);
    Show_End(result,testkey2);
    cout<<""<<endl;

    cout<<"递归折半查找"<<endl;
    cout<<""<<endl;
    result=Search_Bin2(ST, testkey1,low,high);
    Show_End(result,testkey1);
    result=Search_Bin2(ST, testkey2,low,high);
    Show_End(result,testkey2);
    cout<<""<<endl;
}

原文地址:https://www.cnblogs.com/ygjzs/p/12061839.html

时间: 2024-11-08 21:05:54

实现有序表二分查找的相关文章

[LeetCode] #1# Two Sum : 数组/哈希表/二分查找

一. 题目 1. Two SumTotal Accepted: 241484 Total Submissions: 1005339 Difficulty: Easy Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solutio

HDU 5878 I Count Two Three (打表+二分查找) -2016 ICPC 青岛赛区网络赛

题目链接 题意:给定一个数n,求大于n的第一个只包含2357四个因子的数(但是不能不包含其中任意一种),求这个数. 题解:打表+二分即可. #include <iostream> #include <math.h> #include <stdio.h> #include<algorithm> using namespace std; long long data[1000000],tot=0; int main() { long long maxn = 10

hdu 5676 ztr loves lucky numbers(BC——暴力打表+二分查找)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5676 ztr loves lucky numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 594    Accepted Submission(s): 257 Problem Description ztr loves luck

poj 1840 Eqs 【解五元方程+分治+枚举打表+二分查找所有key 】

Eqs Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 13955   Accepted: 6851 Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The coefficients are given integers from the interval [-50,50]. It i

两数之和 II - 输入有序数组 --二分查找

题目 给定一个已按照升序排列的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值(index1 和 index2)不是从零开始的. 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素. 示例: 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 .因此 index1 =

顺序表 | 二分查找:两个数组合并后的中位数

输入两个长度相同的升序数组,返回这两个数组合并后的中位数 C++代码: int bisearch_midNum(int a[],int b[],int n){ int s1=0,s2=0,d1=n-1,d2=n-1,m1,m2; while(s1!=d1 || s2!=d2){//只要a,b序列同时出现了s==d的情况,才能False退出 m1=(s1+d1)/2; m2=(s2+d2)/2; system("pause"); if(a[m1]==b[m2]) return a[m1]

java数据结构之有序表查找

这篇文章是关于有序表的查找,主要包括了顺序查找的优化用法.折半查找.插值查找.斐波那契查找: 顺序优化查找:效率极为底下,但是算法简单,适用于小型数据查找: 折半查找:又称为二分查找,它是从查找表的中间开始查找.查找结果只需要找其中一半的数据记录即可.效率较顺序查找提高不少.比较适用与静态表,一次排序后不在变化: 插值查找:与折半查找比较相似,只是把中间之mid的公式进行了变换将mid = (low+high)/2;换成了mid = low + (high - low) * (key - sum

(转载)查找一 线性表的查找

查找一 线性表的查找 目录 查找的基本概念 顺序查找 二分查找 分块查找 三种线性查找的PK 参考资料 相关阅读 查找的基本概念 什么是查找? 查找是根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素. 查找算法的分类 若在查找的同时对表记录做修改操作(如插入和删除),则相应的表称之为动态查找表: 否则,称之为静态查找表. 此外,如果查找的全过程都在内存中进行,称之为内查找: 反之,如果查找过程中需要访问外存,称之为外查找. 查找算法性能比较的标准 --平均查找长度ASL(Av

查找一 线性表的查找

查找的基本概念 什么是查找? 查找是根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素. 查找算法的分类 若在查找的同时对表记录做修改操作(如插入和删除),则相应的表称之为动态查找表: 否则,称之为静态查找表. 此外,如果查找的全过程都在内存中进行,称之为内查找: 反之,如果查找过程中需要访问外存,称之为外查找. 查找算法性能比较的标准 ——平均查找长度ASL(Average Search Length) 由于查找算法的主要运算是关键字的比较过程,所以通常把查找过程中对关键字需