有序表查找

来源:互联网 发布:华为网络面试 知乎 编辑:程序博客网 时间:2024/06/17 09:12
#include<stdio.h>#define OK 1#define ERROR 0#define TRUE 1#define FLASE 0#define MAXSIZE 100typedef 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);}

有序查找: