数据结构中顺序表的相关查找算法

来源:互联网 发布:先健科技 知乎 编辑:程序博客网 时间:2024/04/30 22:37

今天给大家带来的是相关数据结构的查找算法,相信读过前几篇相关数据结构构建的读者应该能体会到两种常用数据结构的相关基础知识。

查找算法的基础就需要数据结构的支撑,很显然,我们需要掌握的是顺序表和动态链表的查找方法,下面我会一一解答。

这一篇我们就细谈第一种.顺序表的查找算法,很简单,就是对数组下标的运算,由此衍生出来的查找算法有三种:

分别是 简单顺序查找,有序表的二分查找以及索引顺序表的查找

1.简单顺序查找:

要求:对于数据表的特性没有要求,可以有序也可以无序。

方式:查找就是一种遍历的过程,从表的一端开始,逐个的比较元素,若成功,便返回该记录(元素的下标),否者返回0来表示失败。

算法很简单:设定一个监视哨a[0]来指定放置要查找的元素,若能找到,就返回该记录,不然就返回0这个下标来表示失败。

下面是代码实现:

#include<iostream>
using namespace std;
typedef int elementtype;
typedef int keytype;
int main(){
cout<<"请输入数组长度: ";
int length;
cin>>length;
int *a1=new int[length];
cout<<"请依次输入顺序表的各个值:"<<endl;
for(int i=0;i<length;i++){
cin>>a1[i];
}
int x;//定义要查的元素值
cout<<"请输入要查找的元素值: ";
cin>>x;
int sequential_search(elementtype a[],int n,keytype x);//声明简单查找函数
int y=sequential_search(a1,length,x);//将返回值保存
if(y==-1) cout<<"不好意思,这个顺序表中没有您要查的"<<x<<"这个数!"<<endl;
else cout<<"简单查找法查到这个数"<<x<<"在顺序表中的下标值为:"<<y<<endl;
return 1;
}
//简单顺序查找很简单,直接遍历数组判断即可
int sequential_search(elementtype a[],int n,keytype x){
/*
    //这种写法是从后往前遍历,以i为下标
int i=n;
a[0].key=x;
while (a[i].key !=x) i--;
return i;*/
//通常我们使用下面的方法进行简单顺序的查找
for(int i=0;i<n;i++){
if(a[i]==x) return i;
}
return -1;
}

2.有序表的二分查找:

要求:元素排列有序 ,可以以是递增顺序排列,也可以是递减顺序排列

方式:二分查找,故名思义,有折半的意思。其实就是这个意思,这个过程很简单,只要元素在这个序列的范围内,就可以开始二分查找,在序列范围中 进行折半,比较与中间值的大小,把中间值再当成一个范围边界,又做二分查找,很像递归对不对?其实就可以用递归来做,下面我用两种方式来书写这个查找算法的代码:

1.首先这个排列是有序的,如果不是有序,那么进行排序,排序算法将会在下一篇带给大家,这里就先假设已经排好顺序,而且是递增的顺序(为了让读者更容易理解)我将代码运行时的输入过程提示为 按递增顺序输入:

#include<iostream>
using namespace std;
typedef int elementtype;
typedef int keytype;
int main(){
cout<<"请输入数组长度: ";
int length;
cin>>length;
int *a1=new int[length];
cout<<"请按递增顺序输入顺序表的各个值:"<<endl;
for(int i=0;i<length;i++){
cin>>a1[i];
}
int x;//定义要查的元素值
cout<<"请输入要查找的元素值: ";
cin>>x;
int binary_search(elementtype a[],int n,keytype x);//声明二分查找函数
int y=binary_search(a1,length,x);//将返回值保存
if(y==-1) cout<<"不好意思,这个顺序表中没有您要查的"<<x<<"这个数!"<<endl;
else cout<<"二分查找法查到这个数"<<x<<"在顺序表中的下标值为:"<<y<<endl;
return 1;
}
//二分顺序查找也十分简单,数组下标折半对数组值判断比较即可
int binary_search(elementtype a[],int n,keytype x){


int low=0;//设置首下标
int mid;//定义中间下标
int high=n-1;//定义尾下标
//因为是按范围查找,要保证首下标小于或等于尾下标
while(low<=high){
mid=(low+high)/2;//得到中间下标
if(x==a[mid]) return mid;
else if(x<a[mid]) high=mid-1;
else low=mid+1;
}
return -1;
}

2.使用递归做的二分查找算法

#include<iostream>
using namespace std;
typedef int elementtype;
typedef int keytype;
int main(){
cout<<"请输入数组长度: ";
int length;
cin>>length;
int *a1=new int[length];
cout<<"请按递增顺序输入顺序表的各个值:"<<endl;
for(int i=0;i<length;i++){
cin>>a1[i];
}
int x;//定义要查的元素值
cout<<"请输入要查找的元素值: ";
cin>>x;
int binary_search(elementtype a[],int low,int high,keytype x);//声明二分查找函数
int y=binary_search(a1,0,length-1,x);//将返回值保存
if(y==-1) cout<<"不好意思,这个顺序表中没有您要查的"<<x<<"这个数!"<<endl;
else cout<<"二分递归查找法查到这个数"<<x<<"在顺序表中的下标值为:"<<y<<endl;
return 1;
}
//二分顺序查找也十分简单,数组下标折半对数组值判断比较即可
int binary_search(elementtype a[],int low,int high,keytype x){
int mid;//定义中间下标
if(low>high) return -1;//首下标大于尾下标,说明查找必定失败
else{
mid=(low+high)/2;
if(x=a[mid]) return mid;
//递归调用自己,传给自己,当范围在[0,mid]中时,传参数high=mid-1
//当范围在[mid,high]时,传参数low=mid+1;
else if (x<a[mid]) return binary_search(a,low,mid-1,x);
else return binary_search(a,low+1,high,x);
}
}

3.索引顺序表的查找算法

要求:分块有序,啥意思呢?说的是在一个大表中,整个表不是有序表,但是划分为若干块的时候,每一块都是有序的,这个时候为每一块都加上一个索引号,这个索引号一般是用下标来做的,所以索引号组成的索引表必定是有序的。可以做的是对索引表求最大值,那我们查找时就可以做一个二分查找了,由于时间的问题,这里我给出思路,有需要代码的读者可以约了时间,我会在后期更新。

1 0
原创粉丝点击