數據結構中順序表的相關查找算法


今天給大家帶來的是相關數據結構的查找算法,相信讀過前幾篇相關數據結構構建的讀者應該能體會到兩種常用數據結構的相關基礎知識。

查找算法的基礎就需要數據結構的支撐,很顯然,我們需要掌握的是順序表和動態鏈表的查找方法,下面我會一一解答。

這一篇我們就細談第一種.順序表的查找算法,很簡單,就是對數組下標的運算,由此衍生出來的查找算法有三種:

分別是 簡單順序查找,有序表的二分查找以及索引順序表的查找

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.索引順序表的查找算法

要求:分塊有序,啥意思呢?說的是在一個大表中,整個表不是有序表,但是划分為若干塊的時候,每一塊都是有序的,這個時候為每一塊都加上一個索引號,這個索引號一般是用下標來做的,所以索引號組成的索引表必定是有序的。可以做的是對索引表求最大值,那我們查找時就可以做一個二分查找了,由於時間的問題,這里我給出思路,有需要代碼的讀者可以約了時間,我會在后期更新。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com