静态查找(顺序查找和折半查找)

来源:互联网 发布:pdf文件制作软件 编辑:程序博客网 时间:2024/06/01 09:52

听说过一句话,编程之久,除了数据结构和算法什么也不属于我们。为了更好的学习数据结构和算法,今天决定先把清华大学出版的数据结构(C语言版)书中的算法实现一遍。现在开始第一弹。贵在坚持。


顺序查找:

算法描述

#include <stdio.h>
#include <stdlib.h>
//顺序表的查找


#define EQ(a, b) ((a) == (b))


#define ElemTypeint
typedef struct{
ElemType *elem;  //数据元素存储空间基址,建表时按实际长度分配,0号单元留空
int length;  //表长度
}SSTable;


//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0
int Search_Seq(SSTable ST, ElemType key)
{
int i;
ST.elem[0] = key;      //“哨兵”
for(i = ST.length; !EQ(ST.elem[i], key); --i);  //从后往前找


return i;               //找不到时,i为0
}
int main()
{
SSTable s1;
int key=4;
int a[6];
for(int i=1;i<=5;i++){
   a[i]=i;
}
s1.elem=a;
s1.length=5;


int c=Search_Seq(s1,key);
printf("%d\n",c);
}

性能分析:

ASL(successful)=(n+1)/2;

ASL(f)=n+1;

ASL(平均)=(ASL(s)+ASL(f))/2=3/4(n+1);



折半查找:

#include <stdio.h>
#include <stdlib.h>
//折半查找算法
typedef struct{
int *elem;
int length;


}SSTable;
int Search_Bin(SSTable s1,int key,int &n){


int low=1;
int high=s1.length;
while(low<=high){
        n++;
        int mid=(low+high)/2;
if(s1.elem[mid]==key) return mid;
else if(s1.elem[mid]>key) high=mid-1;
else low=mid+1;
}
//没有查找到
return 0;
}
int main()
{
    int n=0;
SSTable s1;
s1.length=12;
int a[12]={0,2,3,4,5,6,7,8,9,12,26,45};
s1.elem=a;
int result=Search_Bin(s1,7,n);
printf("元素所在位置的数组下标为:%d\n",result);
printf("查找的次数为:%d\n",n);
}



性能分析:





效率比较:折半查找>顺序查找





原创粉丝点击