顺序表查找和折半查找

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

相关文章

linux查找java项目日志查找报错信息方式

《linux查找java项目日志查找报错信息方式》日志查找定位步骤:进入项目,用tail-f实时跟踪日志,tail-n1000查看末尾1000行,grep搜索关键词或时间,vim内精准查找并高亮定位,... 目录日志查找定位在当前文件里找到报错消息总结日志查找定位1.cd 进入项目2.正常日志 和错误日

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif