当前位置: 首页 > news >正文

数据结构---五大排序---哈希表---二分查找法

目录

一、五大排序

1.1.冒泡排序 

1.2.选择排序

1.3.插入排序

1.4.希尔排序

1.5.快速排序

二、哈希表

2.1.哈希表结构的定义

2.2.初始化哈希表

2.3.插入元素

2.4.打印哈希表

2.5.查找元素

2.6.销毁哈希表

三、二分查找法(折半查找法)


一、五大排序

1.1.冒泡排序 

时间复杂度:o(n^2)

稳定性:稳定

int BubbleSort(int *pArray, int MaxLen)
{int j = 0;int i = 0;int temp = 0;for (j = 0; j < MaxLen-1; j++){for (i = 0; i < MaxLen-1-j; i++){if (pArray[i] > pArray[i+1]){temp = pArray[i];pArray[i] = pArray[i+1];pArray[i+1] = temp;}}}return 0;
}

1.2.选择排序

时间复杂度:o(n^2)

稳定性:不稳定

int SelectSort(int *pArray, int MaxLen)
{   int Min = 0;int Temp = 0;int i = 0;int j = 0;for (j = 0; j < MaxLen-1; j++){Min = j;for (i = j+1; i < MaxLen; i++){if (pArray[i] < pArray[Min]){Min = i;}}if (Min != j){Temp = pArray[j];pArray[j] = pArray[Min];pArray[Min] = Temp;}}return 0;
}

1.3.插入排序

 时间复杂度 :O(n^2)    已经有序的数据使用插入排序时间复杂度为:O(n)

稳定性:稳定

int InsertSort(int *pArray, int MaxLen)
{int i = 0;int j = 0;int Temp = 0;for (j = 1; j < MaxLen; j++){Temp = pArray[j];for (i = j; i > 0 && Temp < pArray[i-1]; i--){pArray[i] = pArray[i-1];}pArray[i] = Temp;}return 0;
}

1.4.希尔排序

时间复杂度:O(nlogn) 

稳定性:不稳定

int ShellSort(int *pArray, int MaxLen)
{int step = 0;int i = 0;int j = 0;int temp = 0;for (step = MaxLen / 2; step > 0; step /= 2){for (j = step; j < MaxLen; j++){temp = pArray[j];for (i = j; i >= step && temp < pArray[i-step]; i -= step){pArray[i] = pArray[i-step];}pArray[i] = temp;}}return 0;
}

1.5.快速排序

时间复杂度:O(nlogn) 

稳定性:不稳定

int QuickSort(int *pArray, int Low, int High)
{int Key = 0;int j = High;int i = Low;Key = pArray[Low];while (i < j){while (i < j && pArray[j] >= Key){j--;}pArray[i] = pArray[j];while (i < j && pArray[i] <= Key){i++;}pArray[j] = pArray[i];}pArray[i] = Key;if (i-1 > Low){QuickSort(pArray, Low, i-1);}if (i+1 < High){QuickSort(pArray, i+1, High);}return 0;
}

二、哈希表

2.1.哈希表结构的定义

#define INDEX   10struct list_head hashtable[INDEX];typedef struct Data
{struct list_head node;int data;
}Data_t;

2.2.初始化哈希表

int InitHashTable(void)
{int i = 0;for (i = 0; i < INDEX; i++){INIT_LIST_HEAD(&hashtable[i]);}return 0;
}

2.3.插入元素

//按照顺序插入
int compare(struct list_head *pNewNode, struct list_head *pTmpNode)
{if (NULL == pTmpNode){return 1;}return list_entry(pNewNode, Data_t, node)->data - list_entry(pTmpNode, Data_t, node)->data;
}//插入哈希表
int InsertHashTable(int Num)
{int index = 0;Data_t *pNewNode = NULL;//申请节点 pNewNode = malloc(sizeof(Data_t));if (NULL == pNewNode){return -1;}pNewNode->data = Num;//获得插入数据的键值index = Num % INDEX;//插入数据list_add_order(&pNewNode->node, &hashtable[index], compare);return 0;
}

2.4.打印哈希表

int ShowHashTable(void)
{int index = 0;Data_t *pData = NULL;for (index = 0; index < INDEX; index++){printf("%d:", index);list_for_each_entry(pData, &hashtable[index], node){printf("%d ", pData->data);}printf("\n");}return 0;
}

2.5.查找元素

int FindHashTable(int Num)
{int index = 0;Data_t *pData = NULL;int ret = 0;index = Num % INDEX;list_for_each_entry(pData, &hashtable[index], node){if (pData->data == Num){ret = 1;break;}if (pData->data > Num){ret = 0;break;}}return ret;
}

2.6.销毁哈希表

int DestroyHashTable()
{int i = 0;Data_t *pTmpNode = NULL;Data_t *pNextNode = NULL;for (i = 0; i < INDEX; i++){list_for_each_entry_safe(pTmpNode, pNextNode, &hashtable[i], node){free(pTmpNode);}}return 0;
}

三、二分查找法(折半查找法)

只适合顺序表

折半查找的基本思想:首先将给定值key与表中中间位置的元素(mid的指向元素)比较。mid=low+high/2(向下取整)

若key与中间元素相等,则查找成功,返回该元素的存储位置,即mid;
若key与中间元素不相等,则所需查找的元素只能在中间元素以外的前半部分或后半部分。(至于是前半部分还是后半部分要看key与mid所指向元素的大小关系)
a.在查找表升序排列的情况下,若给定值key大于中间元素则所查找的元素只可能在后半部分。此时让low=mid+1;
b.若给定值key小于中间元素则所查找的元素只可能在前半部分。此时让high=mid-1;

int MidSearch(int *pArray, int Low, int High, int tmpdata)
{int Mid = 0;if (Low > High){return -1;}Mid = (Low + High) / 2;if (tmpdata < pArray[Mid]){return MidSearch(pArray, Low, Mid-1, tmpdata);}else if (tmpdata > pArray[Mid]){return MidSearch(pArray, Mid+1, High, tmpdata);}else if (tmpdata == pArray[Mid]){return Mid;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 9,sql 约束
  • 面试题总结(一) -- 基础语法篇
  • 自动化工程案例01:8工位插针装配机01
  • Guitar Pro v8.1最新图文安装教程
  • 73.给定一个 m x n 的矩阵,实现一个算法如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法
  • LeetCode: 551. 学生出勤记录 I
  • 【JavaScript】jQuery的使用
  • 【区块链 + 物联网】长虹智能家居跨平台互联方案 | FISCO BCOS应用案例
  • 安装 rocky9.4
  • PADS提示subnet #1 of gnd 20240902
  • js控制滚轮横向滚动
  • STM32——看门狗(独立/窗口)
  • 安装包丨WebGIS开发环境搭建及所需工具
  • 在VBA中,对Excel单元格的操作方法 (qo+op)
  • 学习之git的常用命令
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Django 博客开发教程 8 - 博客文章详情页
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaScript异步流程控制的前世今生
  • k8s 面向应用开发者的基础命令
  • MQ框架的比较
  • Next.js之基础概念(二)
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python利用正则抓取网页内容保存到本地
  • Vue 重置组件到初始状态
  • Vue.js-Day01
  • 创建一个Struts2项目maven 方式
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从零开始学习部署
  • 盘点那些不知名却常用的 Git 操作
  • 扑朔迷离的属性和特性【彻底弄清】
  • 前端相关框架总和
  • 用Visual Studio开发以太坊智能合约
  • 怎么将电脑中的声音录制成WAV格式
  • nb
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • # Kafka_深入探秘者(2):kafka 生产者
  • (ros//EnvironmentVariables)ros环境变量
  • (接口自动化)Python3操作MySQL数据库
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • ***利用Ms05002溢出找“肉鸡
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET与 java通用的3DES加密解密方法
  • ::什么意思
  • @ComponentScan比较
  • @SpringBootApplication 包含的三个注解及其含义