顺序表的查找

查找的定义是:对给定的一个关键字的值,在数据表中搜索出一个关键字的值等于该值的记录或者元素,若找到了指定的元素,则称为查找成功,通常是返回该元素在查找表中的位置;若不存在指定的元素,则返回一个表示失败的值。

查找算法根据存储数据的结构不同可以分为以下三种:顺序表,也就是数组、树表、散列表等

其中,顺序表根据数据元素是否按顺序排序又可以分为:简单顺序查找(数组元素无序)、二分查找(数组有序)


简单顺序查找:

就是从下表1开始依次比较待查找的元素和数组内元素是否相等,若相等,就返回该元素的下表,否则就返回0;

这里将待查找的元素放在b[0]的位置,是为了避免越界的判断,这样可以节省一半的时间


#include <iostream>
using namespace std;

const int MAX = 10;

int seq_search(int b[],int num,int length){
    int i = length;
    while(b[i] != num)
        i--;
    return i;
}

int main(){
    int num;
    cin>>num;     //要查找的元素
    int a[] = {3,1,3,7,4,6,5};
    int length = sizeof(a)/sizeof(int);
    int b[MAX];
    for(int i=0;i<=length;i++){
        if(i == 0)
            b[i] = num;   //将b[0]默认置为要查找的元素,避免越界判断
        else
            b[i] = a[i-1];
    }
    int position = seq_search(b,num,length);
    cout<<position<<endl;    //输出元素所在的位置,没找到的话 输出0
    return 0;
}

二分查找(数组有序):

1.非递归写法

设置三个标号,low,mid,high,发现如果mid对应的值等于待查找的元素的值,返回mid+1;若待查找的元素小于mid对应的值,则从左边开始找;否则从右边开始找

#include <iostream>
using namespace std;

int bin_search(int *a,int num,int length){
    int mid;
    int low = 0,high = length-1;
    while(low<=high){
        mid = (low + high)/2;
        if(num == a[mid])   return mid+1;
        else if(num < a[mid])   high = mid-1;
        else    low = mid+1;
    }
    return -1;
}

int main(){
    int a[] = {1,2,3,4,5,6,7,8,9};  //供查找的有序表
    int length = sizeof(a)/sizeof(int);
    int num;  //待查找的元素
    cin>>num;
    int position = bin_search(a,num,length);
    cout<<position<<endl;
}


2.递归写法

#include <iostream>
using namespace std;

int bin_search(int *a,int num,int low,int high){
    int mid;
    if(low > high)  return -1;
    else{
        mid = (low + high)/2;
        if(num == a[mid])   return mid+1;
        else if(num < a[mid])
            return bin_search(a,num,low,mid-1);
        else
            return bin_search(a,num,mid+1,high);
    }
}

int main(){
    int a[] = {1,2,3,4,5,6,7,8,9};  //供查找的有序表
    int length = sizeof(a)/sizeof(int);
    int num;  //待查找的元素
    cin>>num;
    int position = bin_search(a,num,0,length-1);
    cout<<position<<endl;
}



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值