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

【数据结构】用堆实现排序

1.升序------建大堆

堆的时间复杂度N*logN

#include<stdio.h>void Swap(int* p1, int* p2)
{int x = *p1;*p1 = *p2;*p2 = x;
}void AdjustUp(int* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[parent] < a[child]){Swap(&a[parent], &a[child]);child = parent;parent = (child - 1) / 2;}elsebreak;}}void AdjustDown(int* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){//筛选子节点中较大的数if (child + 1 < n && a[child + 1] > a[child]){child++;}//父子节点比较后进行交换if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapSort(int* a, int n)
{//建堆,向上调整建堆for (int i = 1;i < n;i++){AdjustUp(a, i);}//自己进行调整int end = n - 1;while (end>0){Swap(&a[end], &a[0]);AdjustDown(a, end,0);--end;}}int main()
{int a[10] = { 23,2,45,3,67,55,41,32,12,48 };HeapSort(&a, 10);for (int i = 0;i < 10;i++){printf("%d ", a[i]);}return 0;
}

2.降序------建小堆

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<time.h>void Swap(int* p1, int* p2)
{int x = *p1;*p1 = *p2;*p2 = x;
}void AdjustDown(int* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){//筛选子节点中较小的数if (child + 1 < n && a[child + 1] < a[child]){child++;}//父子节点比较后进行交换if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void PrintTopk(const char*file, int k)
{//1.建堆——用file中前k个元素建小堆int* topk = (int*)malloc(sizeof(int) * k);assert(topk);FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen fail");return;}//读出前k个数据建小堆for (int i = 0;i < k;i++){fscanf(fout, "%d", &topk[i]);}for (int i = (k -1-1) / 2;i >= 0;i--)//k-1是最后一个数据的下标,在-1除以2是找到它的父节点{AdjustDown(topk, k, i);}//将剩余n-k个元素依次与堆顶元素进行交换,不满则替换int val = 0;int ret = fscanf(fout, "%d", &val);while (ret != EOF){if (val > topk[0]){topk[0] = val;AdjustDown(topk, k, 0);}ret = fscanf(fout, "%d", &val);}for (int i = 0;i < k;i++){printf("%d ", topk[i]);}printf("\n");free(topk);fclose(fout);
}void TestTopy()
{int n = 10000;srand(time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen fail");return;}for (size_t i = 0;i < n;i++){int x = rand() % 10000;fprintf(fin, "%d\n", x);}fclose(fin);PrintTopk(file, 10);
}int main()
{TestTopy();return 0;
}

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

相关文章:

  • JavaWeb 入门:JavaScript 基础与实战详解(Java 开发者视角)
  • 「源力觉醒 创作者计划」_文心大模型 4.5 多模态实测:开源加速 AI 普惠落地
  • 某雷限制解除:轻松获取原始下载链接,支持多任务转换
  • Hyperchain安全与隐私机制详解
  • Android Slices:让应用功能在系统级交互中触手可及
  • ElasticSearch 的3种数据迁移方案
  • RabbitMQ 消息持久化的三大支柱 (With Spring Boot)
  • 深度学习篇---百度AI Studio模型
  • JSON-RPC 2.0 规范
  • JVM知识点(2)
  • 二维经验模态分解(BEMD)算法详解与MATLAB实现
  • Python 程序设计讲义(28):字符串的用法——格式化字符串:format()方法
  • Spring Boot with RabbitMQ:四大核心模式指南
  • python-网络编程
  • PCIE4.0/5.0/DDR4/DDR5使用以及布局布线规则-集萃
  • RHCE综合项目:分布式LNMP私有博客服务部署
  • 【Lua】题目小练4
  • 【保姆级 - 大模型应用开发】DeepSeek R1 本地部署全攻略:Ollama + vLLM + PyTorch 多选方案
  • 【图像处理基石】如何对遥感图像进行实例分割?
  • 【LeetCode 热题 100】34. 在排序数组中查找元素的第一个和最后一个位置——二分查找
  • 宇树 G1 部署(九)——遥操作控制脚本 teleop_hand_and_arm.py 分析与测试部署
  • Go 客户端玩转 ES|QL API 直连与 Mapping Helpers 实战详解
  • 11、read_object_model_3d 读取点云
  • 预装Windows 11系统的新电脑怎么跳过联网验机
  • 预过滤环境光贴图制作教程:第四阶段 - Lambert 无权重预过滤(Stage 3)
  • 三、Linux用户与权限管理详解
  • Redis内存使用耗尽情况分析
  • 编辑距离:理论基础、算法演进与跨领域应用
  • Windows使用Powershell自动安装SqlServer2025服务器与SSMS管理工具
  • css3之三维变换详说