听说过一句话,编程之久,除了数据结构和算法什么也不属于我们。为了更好的学习数据结构和算法,今天决定先把清华大学出版的数据结构(C语言版)书中的算法实现一遍。现在开始第一弹。贵在坚持。
顺序查找:
算法描述
#include <stdio.h>
#include <stdlib.h>
//顺序表的查找
#define EQ(a, b) ((a) == (b))
#define ElemType int
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);
}
性能分析:
效率比较:折半查找>顺序查找