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

关于数据结构6-哈希表和5种排序算法

哈希表

1哈希算法

将数据通过哈希算法映射成一个键值,存取都在同一个位置实现数据的高效存储和查找,将时间复杂度尽可能降低至O(1)

2哈希碰撞

多个数据通过哈希算法得到的键值相同,成为产生哈希碰撞

3哈希表:

  • 构建哈希表存放0-100之间的数据
  • 哈希算法选择:
    • 将0-100之间的数据的各位作为键值

4. 哈希表的实现

        1. 哈希表插入

        

linknode *phashtable[INDEX];
// 一个名为phashtable的指针型数组,一共INDEX个元素 每个元素的值都是linknode*型 指向链表的头节点指针
// phashtable是二级指针哦 指向数组头元素的地址常量(数组内元素都为地址 指向指针的指针则是二级指针)
int insert_hashtable(int tmpdata)
{int key = 0;linknode **pptmpnode = NULL;linknode *pnewnode = NULL;key = tmpdata % INDEX;//*pptmpnode != NULL说明哈希表当前这个元素后面有链表// 注意:你要操作循环的是 存放哈希表的元素指针值(这里变化的i是 二级指针)// pptmpnode等于哈希表里存的元素的地址// 先1 若2 再3(把指针往后挪一个)若2 再3 直到找到存放大于输入的数据的链表位置退出循环for (pptmpnode = &phashtable[key]; *pptmpnode != NULL && (*pptmpnode)->data < tmpdata; pptmpnode = &((*pptmpnode)->pnext)){}// 新建链式空间pnewnode = malloc(sizeof(linknode));if (pnewnode == NULL){perror("fail to malloc");return -1;}pnewnode->data = tmpdata;pnewnode->pnext = *pptmpnode; // 若你插入的数字是62 *pptmpnode则是指向72节点的地址*pptmpnode = pnewnode;        //**ptmpnode 同时也是指向52节点里面pnext的值 改这个值return 0;
}

2. 哈希表遍历

 int show_hashtable(void){int i = 0;linknode *ptmpnode = NULL;for (i = 0; i < INDEX; i++){printf("%d:", i);ptmpnode = phashtable[i];while (ptmpnode != NULL){printf("%2d ", ptmpnode->data);ptmpnode = ptmpnode->pnext;}printf("\n");}return 0;}

排序和查找算法:

1.冒泡排序

  • 1. 时间复杂度为O(n^{2})
  • 2. 稳定的排序算法
  • 3. 排序方法:
    • 相邻的两个元素比较,大的向后走,小的向前走
    • 循环找len-1个大的值

int bubble_sort(int *parray, int len){int i = 0;int j = 0;int tmp = 0;for (j = 0; j < len-1; j++){for (i = 0; i < len-1-j; i++){if (parray[i] > parray[i+1]){tmp = parray[i];parray[i] = parray[i+1];parray[i+1] = tmp;}}}return 0;}

2. 选择排序

  • 1. 时间复杂度O(n^{2})
  • 2. 不稳定排序算法
  • 3. 排序方法:
    • 从前到后找最小值与前面的元素交换
    • 找到len-1个最小值吗,最后一个最大值即排序完成

 int select_sort(int *parray, int len){int i = 0;int j = 0;int tmp = 0;int min = 0;for (j = 0; j < len-1; j++){min = j;for (i = j+1; i < len; i++){if (parray[i] < parray[min]){min = i;}}if (min != j){tmp = parray[min];parray[min] = parray[j];parray[j] = tmp;}}return 0;}

3.插入排序

  • 1. 时间复杂度O(n^{2}),如果是组有序时间复杂度降低至O(n)
  • 2. 稳定的排序算法
  • 3. 排序方法:
    • 将数组中的每个元素插入到有序数列中
    • 先将要插入的元素取出O(n^{2})
    • 依次和前面元素比较,比元素大的向后走,直到前一个元素比要插入的元素小,或者到 达有序数列开头停止
    • 插入元素即可

 int insert_sort(int *parray, int len){int tmp = 0;int i = 0;int j = 0;for (j = 1; j < len; j++){tmp = parray[j];for (i = j; i > 0 && tmp < parray[i-1]; i--){parray[i] = parray[i-1];}parray[i] = tmp;}return 0;
}

4.希尔排序

  • 时间复杂度O(nlogn)
  • 不稳定的排序算法
    •  通过选择不同的步长,将数组拆分成若干个小的数组实现插入排序
    • 若干个小的数组称为有序数列后,使得数组中的数据大致有序
    •  最后再对整体完成一个插入排序

        

/* 耗时: 5 - 10ms*/int shell_sort(int *parray, int len){int step = 0;int j = 0;int i = 0;int tmp = 0;for (step = len/2; step > 0; step /= 2){for (j = step; j < len; j++){tmp = parray[j];for (i = j; i >= step && tmp < parray[i-step]; i -= 
step){parray[i] = parray[i-step];}parray[i] = tmp;}}return 0;}

5.快速排序

        1. 时间复杂度为O(nlogn)

        2. 不稳定的排序算法

        3. 选择左边的作为键值,从后面找一个比键值小的放前面,从前面找一个比键值大的放后面,键 值放中间

        4. 左右两边有元素则递归调用快速排序

int quick_sort(int *parray, int low, int high){int key = 0;int j = 0;int i = 0;key = parray[low];j = high;i = low;while (i < j){while (i < j && parray[j] >= key){j--;}if (i < j){parray[i] = parray[j];}while (i < j && parray[i] <= key){i++;}if (i < j){parray[j] = parray[i];}    }parray[i] = key;if (i-1 > low){quick_sort(parray, low, i-1);}if (i+1 < high){quick_sort(parray, i+1, high);}return 0;}

6.折半查找(二分查找)

        时间复杂度O(logn)

 int mid_search(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 mid;}else if (tmpdata > parray[mid]){return mid_search(parray, mid+1, high, tmpdata);}else if (tmpdata < parray[mid]){return mid_search(parray, low, mid-1, tmpdata);}}

7顺序查找

时间复杂度为O(n)

http://www.xdnf.cn/news/17265.html

相关文章:

  • 【Spring Boot 快速入门】八、登录认证(一)基础登录与认证校验
  • 数据结构:哈希表、排序和查找
  • F I R S T Q U A R T E R 2 0 2 5 - - M a y 2 2 2 0 2 5
  • LINUX88 变量:命令定义;普通数组定义(复);declare -i /-x
  • 【其他分类】Showrunner AI版的Netflix 互动故事创作平台 进行动画生成与微调、角色场景创建
  • MySQL的触发器:
  • 温室韭菜收割机的设计cad【12张】三维图+设计说明书
  • 9:USB摄像头的最后一战(上):MP4音视频合封!
  • Redis(九):Redis高并发高可用(集群Cluster)
  • Javascript中的一些常见设计模式
  • react+echarts实现变化趋势缩略图
  • Elasticsearch:在向量搜索中使用 Direct IO
  • 富士 Instax 12 和 Instax Mini 11 有什么区别?推荐购买哪一款?
  • Microsoft Dynamics AX 性能优化解决方案
  • 【Python-Day 38】告别通用错误!一文学会创建和使用 Python 自定义异常
  • 临床医学 RANDOM SURVIVAL FORESTS(randomSurvivalForest)-2 python 例子
  • 【GPT-OSS 全面测评】释放推理、部署和自主掌控的 AI 新纪元
  • Redis对象编码
  • 微算法科技(NASDAQ:MLGO)使用循环QSC和QKD的量子区块链架构,提高交易安全性和透明度
  • 如何 让ubuntu 在root 下安装的docker 在 普通用户下也能用
  • 基于大数据的地铁客流数据分析预测系统 Python+Django+Vue.js
  • element plus table 表格操作列根据按钮数量自适应宽度
  • 并发编程(五)ThreadLocal
  • 智慧工业设备缺陷检测准确率↑32%:陌讯多模态融合算法实战解析
  • 微软XBOX游戏部门大裁员
  • 6.Linux 系统上的库文件生成与使用
  • 谷粒商城:检索服务
  • 解决Ollama外部服务器无法访问:配置 `OLLAMA_HOST=0.0.0.0` 指南
  • 深度剖析主流AI大模型的编程语言与架构选择:行业实践与技术细节解读
  • 苹果iPhone 17系列将发售,如何解决部分软件适配问题引发讨论