#include<stdio.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FLASE 0
#define MAXSIZE 100
typedef int Status;
/*
顺序查找,a为数组,n为要查找的数组长度,key为要查找的关键字
*/
int Sequential_Search(int *a,int n,int key)
{
int i;
for(i=1;i<=n;i++)
{
if(a[i]==key){
return i;
}
}
return 0;
}
/*
有哨兵顺序查找,每次循环时不需要判断i是否越界
*/
int Sequential_Search2(int *a,int n,int key)
{
int i;
a[0]=key;
i=n;
while(a[i]!=key){
i--;
}
return i; //返回0则说明查找失败
}
//二分查找有序表
Status TwoSort(int *a,int n,int key){
int low,high,mid;
low=1; //定义最低下标为记录首位
high=n; //定义最高下标为记录末尾
while(low<=high){
mid=(low+high)/2; //折半
if(key>a[mid]){ //如果查找值比中间值大
low=mid++; //最低下标调整到中间位置下标高一位
}else if(key<a[mid]) //如果查找值比中间值小
{
high=mid--; //最高下标调整到中间值下标低一位
}else{
return mid; //如果相等则说明mid即为查找到的位置
}
}
return 0;
}
//二分优化 插值查找 优化中间值
Status TwoSort1(int *a,int n,int key){
int low,high,mid;
low=1; //定义最低下标为记录首位
high=n; //定义最高下标为记录末尾
while(low<=high){
mid=low+ (high-low)*(key-a[low])/(a[high]-a[low]); /* 插值 */
if(key>a[mid]){ //如果查找值比中间值大
low=mid+1; //最低下标调整到中间位置下标高一位
}else if(key<a[mid]) //如果查找值比中间值小
{
high=mid-1; //最高下标调整到中间值下标低一位
}else{
return mid; //如果相等则说明mid即为查找到的位置
}
}
return 0;
}
int main(){
int a[MAXSIZE],result,result2,result3,result4;
int arr[MAXSIZE]={1,2,16,24,35,47,59,62,73,88,99};
//赋值给a[]数组从1到100
for(int i=0;i<=100;i++){
a[i]=i;
}
result=Sequential_Search(a,MAXSIZE,20);
printf("你查找元素所在数组的下标是:%d\n",result);
result2=Sequential_Search2(arr,11,88);
printf("你查找元素所在的数组的下标是:%d\n",result2);
//二分查找
result3=TwoSort(arr,10,35);
printf("你使用二分法查找的元素所在的数组的下标是:%d\n",result3);
result4=TwoSort1(arr,10,35);
printf("你使用插值法查找的元素所在的数组的下标是:%d\n",result4);
}
有序查找: