顺序查找以及二分查找
程序员文章站
2022-03-13 22:51:02
...
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
typedef int KeyType;
typedef int Status;
typedef struct{
KeyType key;
}ElemType;
typedef struct{
ElemType *elem;//数据元素存储空间基址,建表时按实际长度分配,0号单元留空
int length;//表的长度
}SSTable;
Status InitList_Sq(SSTable &ST){
ST.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!ST.elem)
exit(OVERFLOW);
ST.length=0;
return OK;
}
Status CreatList(SSTable &ST){
printf("请输入表的长度\n");
scanf("%d",&ST.length);
printf("请输入表内的数据\n");
for(int i=1;i<=ST.length;i++)
{
int x;
scanf("%d",&x);
ST.elem[i].key=x;
}
}
/*未改进的顺序查找
在顺序表ST中顺序查找其关键字等于key的数据元素,
若找到,则返回它在表中的位置,否则返回 0*/
int Search_Seq(SSTable ST,KeyType key){
int i=1;
ElemType *p;
while(i<=ST.length&&!EQ(ST.elem[i].key,key))
++i;
if(i<=ST.length)
return i;
else
return 0;
}
/*改进的顺序查找
在顺序表ST中顺序查找其关键字等于key的数据元素,
若找到,则返回它在表中的位置,否则返回 0。
*/
int GSearch_Seq(SSTable ST,KeyType key){
int i;
ST.elem[0].key=key;// “哨兵”
for(i=ST.length;!EQ(ST.elem[i].key,key);--i);// 从后往前找
return i;
}
/*折半查找
在有序表ST中折半查找其关键字等于key的数据元素。
若找到,则函数值为该元素在表中的位置,否则为0。
*/
int Search_Bin(SSTable ST,KeyType key){
int low,high,mid;
low=1;
high=ST.length;
while(low<=high){
mid=(low+high)/2;
if(EQ(key,ST.elem[mid].key))
return mid;// 找到待查元素
else if(LT(key,ST.elem[mid].key))
high=mid-1;// 继续在前半区间进行查找
else
low=mid+1;// 继续在后半区间进行查找
}
return 0;// 顺序表中不存在待查元素
}
int main(){
int num;
SSTable ST;
InitList_Sq(ST);
CreatList(ST);
printf("请输入想要查找的数值,使用未改进的顺序查找\n");
scanf("%d",&num);
printf("该数值所在位置为%d\n",Search_Seq(ST,num));
printf("请输入想要查找的数值,使用改进的顺序查找\n");
scanf("%d",&num);
printf("该数值所在位置为%d\n",GSearch_Seq(ST,num));
printf("-----------------------------------\n");
printf("进行有序表的操作\n");
SSTable SQ;
InitList_Sq(SQ);
CreatList(SQ);
printf("请输入(有序)表中的数值,进行二分查找\n");
scanf("%d",&num);
printf("该数值所在位置为%d\n",Search_Bin(SQ,num));
}
上一篇: JAVA顺序查找、二分查找
下一篇: Linux 文件权限