查找——顺序查找和折半查找

查找

关于顺序查找和折半查找,可点击此处进入旧金山大学提供的动画演示网站。

顺序查找

​ 顺序查找又称线性查找。它对于顺序表和链表都是适用的。对于顺序表,可通过数组下标递增来顺序扫描每个元素;对于链表,则通过指针next来依次扫描每个元素。

​ 本次顺序表用指针,也就是申请一个堆空间,使用方式和数组还是一致。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>typedef int ElemType;
typedef struct {// 整型指针ElemType *elem;// 存储动态数组里面元素的个数int table_len;
} SSTable;/** 顺序表初始化*/
void st_init(SSTable &ST, int len) {// 多申请一个位置用来存哨兵ST.table_len = len + 1;ST.elem = (ElemType *) malloc(sizeof(ElemType) * ST.table_len);// 筛子srand(time(NULL));// 随机数生成数据for (int i = 1; i < ST.table_len; i++) {// 生产的数字都在0-99中间ST.elem[i] = rand() % 100;}
}/** 打印顺序表*/
void st_print(SSTable ST) {for (int i = 1; i< ST.table_len; i++) {printf("%3d", ST.elem[i]);}printf("\n");
}/** 查找元素位置*/
int search_seq(SSTable ST, ElemType key) {// 零号元素作为哨兵// 遍历数组时 可以少写一个 i >= 0 的判断ST.elem[0] = key;int i;// 从后往前找// 如果找到 i刚好是对应的位置for (i = ST.table_len - 1; ST.elem[i] != key; i--);return i;
}int main() {SSTable ST;// 一、顺序表初始化st_init(ST, 10);// 二、打印顺序表st_print(ST);// 存储元素ElemType key;printf("please input search key:\n");scanf("%d", &key);// 元素存储位置int pos;pos = search_seq(ST, key);if (pos) {printf("search elem success, location: %d\n", pos);} else {printf("search elem failed\n");}return 0;
}

折半查找

​ 折半查找又称为二分查找,它仅适用于有序的顺序表。

折半查找的基本思想:首先将给定值key与表中间位置的元素比较。若相等,则查找成功,返回该元素的存储位置。若不等,则所需要查找的元素只能在中间元素以外的前半部分或后半部分(例如:在查找表升序排列时,若给定值key大于中间元素,则查找的元素只可能在后半部分),然后再缩小的范围内继续进行同样的查找,如此重复,直到找到为止。或确定表中没有所需要查找的元素,则查找不成功,返回查找失败的信息。

​ 针对顺序表有序,使用 qsort 来排序, qsort 的使用方法如下:

#include <stdlib.h>void qsort(void *buf, size_t num, size_t size, int (*compare)(const void*, const void*));
  • buf:要排序数组的起始地址,也可以是指针,申请了一块连续的堆空间。
  • num:数组中元素的个数。
  • size:数组中每个元素所占用的空间大小。
  • compare:比较规则,需要我们传递一个函数名,这个函数由我们自己编写,返回值必须是 int 类型,形参是两个 void 类型指针,这个函数我们编写,但是由qsort内部调用,相当于我们传递一种行为给qsort。

折半查找不需要用到哨兵,因此不要受上一节顺序查找的影响,代码实战流程是:

  1. 我们初始化顺序表,随机10个元素。
  2. 使用 qsort 进行排序,排序完毕后,打印。
  3. 输入要查找的元素值,存入变量 key 中。
  4. 通过二分查找查找对应 key 值,找到则输入在顺序表中的位置,没找到输出未找到。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>typedef int ElemType;
typedef struct {// 整型指针ElemType *elem;// 存储动态数组里面元素的个数int table_len;
} SSTable;/** 顺序表初始化*/
void st_init(SSTable &ST, int len) {// 折半查找不使用0号位置作为哨兵ST.table_len = len;ST.elem = (ElemType *) malloc(sizeof(ElemType) * ST.table_len);// 筛子srand(time(NULL));// 随机数生成数据for (int i = 0; i < ST.table_len; i++) {// 生产的数字都在0-99中间ST.elem[i] = rand() % 100;}
}/** 打印顺序表*/
void st_print(SSTable ST) {for (int i = 0; i < ST.table_len; i++) {printf("%3d", ST.elem[i]);}printf("\n");
}/** 比较两个值的大小*/
int compare(const void *left, const void *right) {// 从大到小排序// return *(ElemType *)right - *(ElemType *)left;// 从小到大排序return *(ElemType *)left - *(ElemType *)right;
}/** 二分查找*/
int binary_search(SSTable L, ElemType key) {int low = 0, high = L.table_len, mid;while (low <= high) {mid = (low + high) / 2;if (L.elem[mid] == key) {// 找到了return mid;} else if (L.elem[mid] > key) {high = mid - 1;} else if (L.elem[mid] < key) {low = mid + 1;}}// 没有找到 不返回0是因为元素可能会在0号位置return -1;
}int main() {SSTable ST;// 一、顺序表初始化st_init(ST, 10);// 二、打印顺序表st_print(ST);// 三、排序qsort(ST.elem, ST.table_len, sizeof(ElemType), compare);st_print(ST);// 存储元素ElemType key;printf("please input search key:\n");scanf("%d", &key);// 元素存储位置int pos;pos = binary_search(ST, key);if (-1 != pos) {printf("find success, pos = %d\n", pos);} else {printf("find failed\n");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/28054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Doris 基础 -- 部分数据类型及操作

您还可以使用SHOW DATA TYPES;查看Doris支持的所有数据类型。 部分类型如下&#xff1a; Type nameNumber of bytesDescriptionSTRING/可变长度字符串&#xff0c;默认支持1048576字节(1Mb)&#xff0c;最大精度限制为2147483643字节(2gb)。大小可以通过BE配置string_type_le…

点云传统算法

1 滤波&#xff0c;过滤噪点&#xff0c;下采样 统计滤波&#xff1a; voxel&#xff0c; 半径搜索&#xff1a; # 基于体素网格化的滤波器 voxel_down_pcd cloud.voxel_down_sample(voxel_size0.5)# 基于半径搜索的滤波器 cl, ind cloud.remove_statistical_outlier(nb_ne…

java问题解决: IDEA java 警告 源发行版 17 需要目标发行版 17

效果图 问题原因 jdk和你实际安装的jdk不匹配 解决问题 1.点击File -->Project Structure–>Project 修改这两处 2. 在Project Structure–>Modules中的红框位置都要调整对应版本 3、点击File–>settings–>java compile将对应框的版本修改成对应版本即可–改…

按键精灵的每隔10秒点击屏幕中央的代码

要在按键精灵中设置每隔10秒点击屏幕中央的代码&#xff0c;你可以参考以下步骤和代码&#xff1a; 步骤 确定坐标&#xff1a;首先&#xff0c;你需要确定屏幕中央大门的精确坐标。你可以使用按键精灵的“抓抓”工具来获取这些坐标。 编写脚本&#xff1a;在按键精灵中创建一…

Cocos Creator,Youtube 小游戏!

YouTube 官方前段时间发布了一则重磅通知&#xff0c;宣布平台旗下小游戏功能 Youtube Playables 正式登录全平台&#xff08;安卓、iOS、网页&#xff09;&#xff0c;并内置了数十款精选小游戏。 Youtube Playables 入口&#xff1a; https://www.youtube.com/playables Coco…

筛斗数据:如何利用数据提取技术提高能源利用效率

在当前的数字时代&#xff0c;数据提取技术已成为推动能源利用效率提升的重要工具。随着技术的进步和数据分析方法的创新&#xff0c;我们现在能够更精确地监测、分析和优化能源使用&#xff0c;从而实现节能减排和经济效益的双重目标。以下是几种关键的方法来展示如何利用数据…

正则的介绍

一、正则 是一种用来描述、匹配和操作字符串的工具。它由一系列字符组成的模式构成&#xff0c;可以用来检索、替换、提取或验证文本数据。 二、正则表达式 由普通字符和特殊字符组成&#xff0c;通过定义匹配规则来实现对字符串的处理 三、正则表达式的基本语法规范 字符匹…

苹果WWDC 2024 带来的 AI 风暴:从生产力工具到个人助理,AI 将如何融入我们的生活?

2024年6月5日&#xff0c;苹果WWDC 2024全球开发者大会如约而至&#xff0c;带来了众多令人兴奋的新功能和新产品。其中&#xff0c;AI 技术的全面融入无疑是最引人注目的亮点。从 iOS、iPadOS 到 macOS&#xff0c;再到 Siri 和开发者工具&#xff0c;苹果正在将 AI 融入到其生…

一位优秀程序员的近距离观察

### 专注与创新精神  对于程序员来说&#xff0c;专注和创新精神是最为重要的职业素养。首先&#xff0c;程序员需要全身心地投入到编程工作中&#xff0c;持续不断地学习和提高自己的技能&#xff0c;这不仅需要投入大量的时间和精力&#xff0c;还需要坚韧不拔的决心和毅力…

ubuntu20.04桌面蓝屏问题解决

前些天做仿真项目&#xff0c;遇到了ubuntu蓝屏问题&#xff0c;于是想着找几个参考办法修复&#xff0c;但不管用&#xff0c;疑似是重要组件损坏。 损坏的原因是强制关机&#xff0c;但究竟是强制关了哪一个卡死的进程&#xff0c;不得而知&#xff0c;我有一个关不掉的仿真…

PostgreSQL 数据类型详细说明

PostgreSQL 提供了多种数据类型&#xff0c;每种数据类型都有其特定的应用场景、数据类型范围以及使用禁忌。以下是一些常见的数据类型及其相关信息&#xff1a; 数值类型&#xff1a; SMALLINT: 范围是 -32768 到 32767。适用于小范围的整数数据&#xff0c;如年龄、数量。INT…

CSS语言笔记

Cascading Style Sheets(级联样式表) CSS是一种样式表语言&#xff0c;用于HTML文档的控制外观&#xff0c;定义布局。 HTML与CSS关系&#xff1a; HTML是网页内容 CSS是网页样式 <!DOCTYPE html> <html><head><meta charset"utf-8">&l…

万事开头难——Java实现俄罗斯小方块【第一步】

目录 技术实现&#xff1a; 1.初始化游戏窗口&#xff1b; 1.1 什么是窗口&#xff1a; 1.2 Swing 1.3 JFrame创建窗口&#xff1a; 1.3.1创建窗口的逻辑 1.3.2.设置简单的页面 1.3.3.优化 1.3.4.设置标题 1.4 创建游戏窗口 技术实现&#xff1a; 1.初始化游戏窗口&am…

基于android开发平台的聊天软件实现(论文+源码)_kaic

摘要&#xff1a;互联网时代的到来使得手机通讯变得更为普及和强大&#xff0c;人们可以随时随地地进行交流。由于工作的繁忙以及生活节奏的加快&#xff0c;人们无法有更多时间展开面对面的交谈&#xff0c;导致在线聊天软件的使用更加频繁&#xff0c;所以本文尝试设计了一款…

Node入门以及express创建项目

前言 记录学习NodeJS 一、NodeJS是什么&#xff1f; Node.js 是一个开源和跨平台的 JavaScript 运行时环境 二、下载NodeJs 1.下载地址(一直点击next即可&#xff0c;记得修改安装地址) https://nodejs.p2hp.com/download/ 2.查看是否安装成功&#xff0c;打开命令行 nod…

css入门宝典

3.1.4 通配符选择器 语法 : *{} 作用 : 让页面中所有的标签执行该样式,通常用来清除间距 例子 : *{ margin: 0; //外间距 padding: 0; //内间距 } 一 CSS基本语法 1基础知识 1.1概述 Css (层叠样式表)是种格式化网页的标准方式&#xff0c; 用于控制设置网页的样式&#xff…

【INTEL(ALTERA)】编程了错误的加密密钥后,为什么 Agilex™ 7 设备无法恢复?

目录 说明 解决方法 说明 如果您意外地对加密密钥编程错误&#xff0c;Agilex™ 7 设备将无法恢复。这是此设备的预期行为。 解决方法 此错误没有恢复流程。使用 Agilex™ 7 设计安全功能时&#xff0c;请注意加密密钥并仔细编程。

windows系统,家庭自用NAS。本地局域网 Docker安装nextcloud

windows系统&#xff0c;家庭自用NAS。本地局域网 Docker安装nextcloud 1、docker安装 太简单了&#xff0c;直接去搜一搜。 docker-compose 相关命令 docker-compose down docker compose up -d2、还是使用老的 在你需要挂载的目录下&#xff0c;新建一个文件&#xff0c;…

Linux在创建用户的时候遇到的错误:useradd: Permission denied.useradd:无法锁定 /etc/passwd,请稍后再试。

针对以下这个问题主要时权限问题 1.当我们输入useradd (创建的用户名&#xff0c;一般用英文) -m -s /bin/bash命令创建用户时&#xff0c;不是root用用户就会报错 [yllocalhost /]$ useradd hsyl -m -s /bin/bash useradd: Permission denied. useradd&#xff1a;无法锁定 …

POC EXP | woodpecker插件编写

woodpecker插件编写 目录 woodpecker介绍woodpecker使用插件编写 安装环境 woodpecker-sdkwoodpecker-request 创建Maven项目 Confluence OGNL表达式注入漏洞插件编写 创建Package包和Class类编写POC 漏洞POC代码编写导出jar包将jar包放入woodpecker的plugin目录运行woodpeck…