基于线性表的哨兵查找和折半查找

#include<stdio.h>
typedef int KeyType;
#define LIST_SIZE 20
typedef struct RecordType
{
KeyType key;
//OtherType other_data;
}RecordType;

typedef struct RecordList
{
RecordType r[LIST_SIZE+1];
int length;
}RecordList;

void Init(RecordList *l,KeyType k)
{
l->r[0].key=0;
RecordType r[LIST_SIZE+1];
printf("请输入长度:");
scanf("%d",&l->length);
for(int i=1;i<l->length;i++)
{
printf("输入序列中元素:");
scanf("%d",&l->r[i].key);
}
/* for(i=1;i<l.length;i++)
{
printf("初始化的序列为%d\n", l.r[i].key);
}*/
}

//哨兵查找
int SeqSearch(RecordList l,KeyType k)
{
int i;
i=l.length;
while(i>=1&&l.r[i].key!=k)
{
i--;
}
if(i>=1)return i;
else return 0;
}

//折半查找
int BinSearch(RecordList l,KeyType k)
{
int low,mid,high;
low=1;
high=l.length;
printf("请输入要查找的值:");
scanf("%d",&k);
while(low<=high)
{
mid=(low+high)/2;
if(k==l.r[mid].key)
{
return (mid);
}
else if(k<l.r[mid].key)
{
high=mid-1;
}
else low=mid+1;
}
return 0;
}

void main()
{
RecordList l;KeyType k;
int i,result1,result2;
Init(&l,k);
printf("请选择:---1.哨兵查找。2.折半查找。\n");
scanf("%d",&i);
switch(i)
{
case 1:
result1=SeqSearch(l,k);
printf("%d\n",result1);
case 2:
result2=BinSearch(l,k);
printf("%d\n",result2);
default:
printf("Error!");
}
}

时间: 2024-10-14 11:41:14

基于线性表的哨兵查找和折半查找的相关文章

数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找.本篇博客会给出相应查找算法的示意图以及相关代码,并且给出相应的测试用例.当然本篇博客依然会使用面向对象语言Swift来实现相应的Demo,并且会在github上进行相关Demo的分享. 查找在生活中是比较常见的,本篇博客所涉及的这几种查找都是基于线性结构的查找.也就是说我们的查找表是一个线性表,我

静态查找表:顺序查找、折半查找、分块查找

引言: 除去各种线性和非线性的数据结构外.另一种在实际应用中大量使用的数据结构--查找表.查找表是由同一类型的数据元素构成的集合. 对查找表常常进行的操作有:1.查找某个"特定的"数据元素是否在查找表中:2.检索某个"特定的"数据元素的各种属性:3.在查找表中插入一个数据元素:4.从查找表中删去某个数据元素.对查找表仅仅作前两种统称为"查找"的操作,则称此类查找表为静态查找表. 若在查找过程中同一时候插入查找表中不存在的数据元素,或者从查找表中删

【线性表基础】基于线性表的简单算法【Java版】

本文描述了基于线性表的简单算法及其代码[Java实现] 1-1 删除单链表中所有重复元素 // Example 1-1 删除单链表中所有重复元素 private static void removeRepeat(LinkList L) { Node node = L.head.next; // 首结点 while (node != null) // 一重循环,遍历L中的每一个元素 { // Object data=p.data; Node p = node; // q结点的前驱 Node q =

算法:顺序查找与折半查找

资料摘自:<数据结构c++语言描述> typedef int DataType; //顺序查找算法 //用顺序查找在n元数组list中查找与key等值的元素,返回该数组元素的下标 //若未找到,则返回-1 int SeqSearch(DataType List[], int n, DataType key) { for(int i = 0; i < n; i++) { if(List[i] == key) { return i; } } return -1; } /* *顺序查找的复杂度

二分查找 (折半查找)

二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构          2.必须按关键字大小有序排列. [优缺点]折半查找法的优点是比较次数少,查找速度快,平均性能好;             其缺点是要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于 不经常变动而 查找频繁的有序列表. [算法思想]首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:                              否则利用中

二分查找(折半查找)C++

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少: 其缺点是要求待查表为有序表,且插入删除困难. 因此,折半查找方法适用于不经常变动而查找频繁的有序列表. 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功: 否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表. 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查

【1】二分查找(折半查找)

二分查找又称折半查找,它是一种效率较高的查找方法.  [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. /** * 二分查找又称折半查找,它是一种效率较高的查找方法. [二分查找要求]:1.必须采用顺序存储结构 2.必须按关键字大小有序排列. * * @author Administrator * */ public static void main(String[] args) { int[] src = new int[] { 1, 3, 5, 7, 8, 9 };

基于线性表的功能函数大全

顺序表 一:线性表的存储结构 顺序表的顺序存储是指一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表中在逻辑结构中相邻的元素存储在连续的物理存储单元中.采用顺序存储结构存储的线性表通常简称顺序表,可将顺序表归纳为:关系线性化,结点顺序存. 用C语言定义线性表的顺序存储表示 #define MAXSIZE 100 Typedef struct { ElemType elem[MAXSIZE]; int last; } 二:线性表顺序存储结构上的基本运算 (1)查找操作 查找可采用顺序查找

基于二分查找(折半查找)的时间范围匹配

需求介绍 1.有dateLeft和dateRight两个txt文件 dateLeft.txt dateRight.txt 左边的表时间比较紧凑,每秒都有:右边的表时间比较分散,间隔都是几分钟 2.需要从Left表中取出一行,匹配属于Right表中属于哪一行的时间范围 例如 2017-08-21 11:44:40.838 人为观察是更接近Right表的第二行-11:44:44:154等 写出程序从左边找出右边所属时间的行,然后获取它的run=? 3.算法实现 1.通过两层循环遍历匹配,算出每次匹配