顺序表查找和折半查找

2024-05-28 14:32
文章标签 查找 顺序 折半

本文主要是介绍顺序表查找和折半查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>  //包含memsetd的函数//对两个数值型关键字的比较约定如下:
#define EQ(a,b)   ((a) == (b))
#define LT(a,b)   ((a) < (b)) 
#define LQ(a,b)   ((a) <= (b))#define OK 1;
#define KeyType int
//#define ElemType inttypedef struct KeyTable
{KeyType key;  //关键字字域
}ElemType;struct SSTable
{ElemType *elem; //数据元素存储空间基址,建表时按实际长度分配,0号单元留空int length;   int cnt; //有效元素的个数
};void Init_arr(SSTable *ST,ElemType *arr,int n);
void Creat_Seq(SSTable *ST,ElemType *arr,int n);  //给数组赋值
void Ascend(SSTable *ST);  //重建静态查找表,排序 升序
void Creat_Ord(SSTable *ST, ElemType *arr,int n);
int Destroy(SSTable *ST);
int Search_Seq(SSTable *ST,KeyType key);
int Search_Bin(SSTable *ST,KeyType key); //折半查找
void Traverse(SSTable *ST);int main(void)
{int seq,bin;struct SSTable pSSTable;ElemType r[6] = {4,2,1,3,6,5};Init_arr(&pSSTable,r,6);Creat_Seq(&pSSTable,r,6);Traverse(&pSSTable);Ascend(&pSSTable);printf("排序后的元素为:\n");Traverse(&pSSTable);seq = Search_Seq(&pSSTable,3);printf("顺序查找元素的下标为:%d\n",seq);bin = Search_Bin(&pSSTable,8);printf("折半查找元素的小标为:%d\n",bin);return 0;
}void Init_arr(SSTable *ST,ElemType *arr,int n)
{ST->elem = (ElemType *)calloc(n+1,sizeof(ElemType));if(NULL == ST->elem){printf("动态内存分配失败!\n");exit(-1);}else{memset(ST->elem,0,n+1);//初始化分配的内存区域,初始化为0ST->length = n+1; //整个数组的长度ST->cnt = 0;/*  for(int i=0 ; i<n ; i++)*  {*      ST->elem[i+1] = arr[i];*      (ST->cnt)++;*  } */}
}void Creat_Seq(SSTable *ST,ElemType *arr,int n)  //给数组赋值
{int i;for(i=0 ,ST->cnt = 0 ; i<n ; i++){ST->elem[i+1] = arr[i];(ST->cnt)++;}   
}void Ascend(SSTable *ST)
{int i,j;for(i=1 ; i<ST->cnt ; i++){ST->elem[0] = ST->elem[i];  //待比较值存[0]单元for(j=i+1 ; j<=ST->cnt ; j++){if(ST->elem[i].key > ST->elem[j].key){ST->elem[0] = ST->elem[j];ST->elem[j] = ST->elem[i];ST->elem[i] = ST->elem[0];}}}
}int Destroy(SSTable *ST)
{free(ST->elem);ST->elem = NULL;ST->length = 0;ST->cnt = 0;return OK;
}int Search_Seq(SSTable *ST,KeyType key)
{int i;ST->elem[0].key = key; //哨兵for(i=ST->cnt ; key != (ST->elem[i].key) ; --i); //从前往后找return i; //找不到i=0
}int Search_Bin(SSTable *ST,KeyType key) //折半查找
{int low,high,mid;low = 1;high = ST->cnt;while(low <= high){mid = (low + high)/2;if(key == ST->elem[mid].key)return mid;  //返回查找元素的下标else if(key < (ST->elem[mid].key))high = mid -1;elselow = mid + 1;}return 0; //查找失败返回0
}void Traverse(SSTable *ST)
{int i;ElemType *p = ST->elem;for(i = 1;i <= ST->cnt ;i++)printf("  %d",p[i].key);printf("\n");
}

这篇关于顺序表查找和折半查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1010832

相关文章

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

Verybot之OpenCV应用二:霍夫变换查找圆

其实我是想通过这个程序来测试一下,OpenCV在Verybot上跑得怎么样,霍夫变换的原理就不多说了,下面是程序: #include "cv.h"#include "highgui.h"#include "stdio.h"int main(int argc, char** argv){cvNamedWindow("vedio",0);CvCapture* capture;i

Win8下如何快速查找和删除电脑中的病毒

Win8系统如何查找和删除病毒?检查你的电脑是否存在病毒的一种快速方法是使用 Windows Defender. 此恶意软件防护随 Windows 提供,可帮助识别和删除病毒、间谍软件和其他恶意软件。   注意:如果你使用的是 Windows RT,则 Windows Defender 会始终启用,并且不能关闭。   如果你使用的是 Windows 8,则可以根据自己的喜好运行由其他

nyoj 685 查找字符串

当初一开始没做出来。 后来,学习过一段时间之后,在返回来做这道题,忽然发现,map类容器可以做。 PS:需要注意的是:此题如果用c++的输入输出的话,会超时。 O(time):gets()<  scanf() < cin。   附上代码: #include<stdio.h>#include<map>#include<string>#include<string.h>usin

[数据结构]队列之顺序队列的类模板实现

队列是一种限定存取位置的线性表,允许插入的一端叫做队尾(rear),允许删除的一端叫做队首(front)。 队列具有FIFO的性质 队列的存储表示也有两种方式:基于数组的,基于列表的。基于数组的叫做顺序队列,基于列表的叫做链式队列。 一下是基于动态数组的顺序队列的模板类的实现。 顺序队列的抽象基类如下所示:只提供了接口和显式的默认构造函数和析构函数,在派生类中调用。 #i

[数据结构]栈之顺序栈的类模板实现

栈的数组实现形式,采用动态分配数组,不够时可以调整栈的大小。 Stack.h文件:主要定义栈的抽象基类,提供公共的接口函数。 #ifndef STACK#define STACK//栈的抽象基类template<class T>class Stack{public:Stack(){}~Stack(){}virtual void Push(const T& x)=0;virt

【C++二分查找】2439. 最小化数组中的最大值

本文涉及的基础知识点 C++二分查找 LeetCode2439. 最小化数组中的最大值 给你一个下标从 0 开始的数组 nums ,它含有 n 个非负整数。 每一步操作中,你需要: 选择一个满足 1 <= i < n 的整数 i ,且 nums[i] > 0 。 将 nums[i] 减 1 。 将 nums[i - 1] 加 1 。 你可以对数组执行 任意 次上述操作,请你返回可以得到的 n

C++中类的构造函数调用顺序

当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的 构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。 简而言之,对象是由“底层向上”开始构造的。因为,构造函数一开始构造时,总是 要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时, 如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序