顺序表查找和折半查找

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

相关文章

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

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

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

C#实现查找并删除PDF中的空白页面

《C#实现查找并删除PDF中的空白页面》PDF文件中的空白页并不少见,因为它们有可能是作者有意留下的,也有可能是在处理文档时不小心添加的,下面我们来看看如何使用Spire.PDFfor.NET通过C#... 目录安装 Spire.PDF for .NETC# 查找并删除 PDF 文档中的空白页C# 添加与删

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表