1.顺序查找
顾名思义,就是按顺序往下一个一个查找,找到时返回,最差的情况是未找到并且全部遍历了一遍,这是消耗时间最长的一个方法
1.1代码实例:顺序查找
//顺序查找
int SeqSearch(RecType R[],KeyType x,int n){
printf("开始顺序查找元素=>%d\n",x);
for(int i=0;i<n;i++){
if(R[i].data==x){
printf("找到元素%d了,在第%d个\n",x,i+1);
return i+1;
}
}
printf("找不到该元素%d\n",x);
return -1;
}
2.二分法查找(折半查找法)
顾名思义,折半查找就是找一个元素,没找到就"切"一半继续找,直接舍弃另一边的元素
个人认为此方法需要建立在元素值已经排序后才可以进行查找元素位置
话不多说先上图
假设我们需要找到元素70的位置
- 先确定1位和末尾(图中为11位)的位置,值赋给low和high代表左驱和右驱,中间位置(图中为6)赋值给mid
这时肯定有同学会问(就是我自己了),如果中间位置有俩怎么办呢,其实这个mid值的数据类型的int型的,也就是说假设(3+6)/2=4.5时,int类型的mid会得到4,也就是整型数据不看小数点(不是四舍五入,是不看小数点) - 接下来比对mid位置的值是否等于要查找的值(图中为70),此时可以看到,56<70,所以需要在值更大的区间去寻找(这也是为什么我说二分法需要排序的原因),即进行 low=mid , mid=(left+right)/2
- 继续比对,现在mid=80了,80>70,即需要在更小区间,即进行 right=mid,mid=(left+right)/2 操作
- 重复操作,直到left==right为止结束
2.1代码实例:二分法查找元素
//二分查找
int HalfSearch(RecType R[],KeyType x,int n){
printf("开始二分查找元素=>%d\n",x);
int left=0,right=n-1,mid=(left+right)/2;
while(left!=right){
if(R[mid].data==x){
printf("找到%d元素的位置为%d\n",x,mid+1);
return mid;
}
if(R[mid].data>x){
right=mid;
mid=(left+right)/2;
}else if(R[mid].data<x){
left=mid;
mid=(left+right)/2;
}
}
printf("找不到该元素%d\n",x);
return -1;
}
3.完整代码及结果示例
#include<stdio.h>
#include<stdlib.h>
typedef int KeyType;
typedef int InfoType;
typedef struct{
KeyType key;
InfoType data;
}RecType;
//创建
void CreatList(RecType R[],KeyType keys[],int n){
for(int i=0;i<n;i++){
R[i].data=keys[i]+12;
R[i].key=i+1;
}
printf("创建成功\n");
}
//顺序查找
int SeqSearch(RecType R[],KeyType x,int n){
printf("开始顺序查找元素=>%d\n",x);
for(int i=0;i<n;i++){
if(R[i].data==x){
printf("找到元素%d了,在第%d个\n",x,i+1);
return i+1;
}
}
printf("找不到该元素%d\n",x);
return -1;
}
//二分查找
int HalfSearch(RecType R[],KeyType x,int n){
printf("开始二分查找元素=>%d\n",x);
int left=0,right=n-1,mid=(left+right)/2;
while(left!=right){
if(R[mid].data==x){
printf("找到%d元素的位置为%d\n",x,mid+1);
return mid;
}
if(R[mid].data>x){
right=mid;
mid=(left+right)/2;
}else if(R[mid].data<x){
left=mid;
mid=(left+right)/2;
}
}
printf("找不到该元素%d\n",x);
return -1;
}
//输出
void DispList(RecType R[],int n){
for(int i=0;i<n;i++){
printf("关键字:%d 所对应的元素值为%d\n",R[i].key,R[i].data);
}
}
int main(){
int keys[10]={1,2,3,4,5,6,7,8,9,10};
RecType R[20];
CreatList(R,keys,10);
DispList(R,10);
int local=SeqSearch(R,4,10);
local=SeqSearch(R,14,10);
local=HalfSearch(R,18,10);
local=HalfSearch(R,8,10);
}
结果
创建成功
关键字:1 所对应的元素值为13
关键字:2 所对应的元素值为14
关键字:3 所对应的元素值为15
关键字:4 所对应的元素值为16
关键字:5 所对应的元素值为17
关键字:6 所对应的元素值为18
关键字:7 所对应的元素值为19
关键字:8 所对应的元素值为20
关键字:9 所对应的元素值为21
关键字:10 所对应的元素值为22
开始顺序查找元素=>4
找不到该元素4
开始顺序查找元素=>14
找到元素14了,在第2个
开始二分查找元素=>18
找到18元素的位置为6
开始二分查找元素=>8
找不到该元素8