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

数据结构 | 堆排序

数据结构 | 堆排序

文章目录

  • 数据结构 | 堆排序
      • 建立大堆
      • 排序
      • 结果以及全部代码

如果没有看过堆的实现的话可以先看前面的一章堆的实现,然后再来看这个堆排序,都是比较简单的~~

  • 这里堆排序首先建堆,建堆是要建小堆还是大堆呢?
  • 在堆排序算法中,建立大顶堆的过程是为了确保堆的根节点是整个堆中最大的元素。
    当你需要进行升序排序时,你希望最大的元素排在序列的最后
  • 堆排序的基本思想是首先将待排序的序列构建成一个大顶堆,然后将堆顶元素(最大元素)与堆的最后一个元素交换,接着对剩余的元素重新构建大顶堆,然后再次交换堆顶元素与堆的最后一个元素,如此往复,直到整个序列有序。
  • 建立大顶堆的目的是为了每次交换后,将最大的元素沉到序列的末尾,逐步形成有序的序列。如果你希望升序排序,建立大顶堆是符合这一目标的。

建立大堆

void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void AdjustUp_Big(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

测试一下:

int a[] = { 4,6,2,1,5,8,2,9 };
int sz = sizeof(a) / sizeof(a[0]);
for (int i = 1; i < sz; i++)
{AdjustUp_Big(a, i);
}

排序

void AdjustDown_Big(HPDataType* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && a[child + 1] > a[child])++child;if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}

在这里插入图片描述

//end是在最后一个元素的下标-1
int end = sz - 1;
while (end > 0)
{//根和最后一个值进行交换,最后一个数不看做堆里面的Swap(&a[0], &a[end]);AdjustDown_Big(a, end, 0);--end;
}

结果以及全部代码

void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void AdjustUp_Big(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
void AdjustDown_Big(HPDataType* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && 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[] = { 4,6,2,1,5,8,2,9 };int sz = sizeof(a) / sizeof(a[0]);/*for (int i = 1; i < sz; i++){AdjustUp_Big(a, i);}*///向下调整建堆,这样效率更高,上面那个也可以for (int i = (sz - 1 - 1)/2; i >= 0; --i){AdjustDown_Big(a, sz, i);}//打印printf("排序前:");for (int i = 0; i < sz; i++){printf("%d ", a[i]);}printf("\n");//排序//end是在最后一个元素的下标-1int end = sz - 1;while (end > 0){//根和最后一个值进行交换,最后一个数不看做堆里面的Swap(&a[0], &a[end]);AdjustDown_Big(a, end, 0);--end;}//打印printf("排序后:");for (int i = 0; i < sz; i++){printf("%d ", a[i]);}
}

在这里插入图片描述

http://www.lryc.cn/news/245801.html

相关文章:

  • 编程语言发展史:Go语言的设计和特点
  • FinGPT:金融垂类大模型架构
  • 24. 深度学习进阶 - 矩阵运算的维度和激活函数
  • 杰发科技AC7801——keil工程移植到IAR
  • Word怎么看字数?简单教程分享!
  • 万字解析设计模式之观察者模式、中介者模式、访问者模式
  • 【MySQL | TCP】宝塔面板结合内网穿透实现公网远程访问
  • Python break用法详解
  • 【C++初阶】STL详解(五)List的介绍与使用
  • MySQL特点和基本语句
  • Gin 学习笔记03-参数绑定
  • 【100天精通Python】Day73:python机器学习入门算法详解与代码示例
  • Node.js入门指南(四)
  • Java LeetCode篇-深入了解关于数组的经典解法
  • LeeCode前端算法基础100题(4)- 无重复字符的最长子串
  • Axios简单使用与配置安装-Vue
  • 【初始前后端交互+原生Ajax+Fetch+axios+同源策略+解决跨域】
  • C语言--每日选择题--Day24
  • 记一次简单的PHP反序列化字符串溢出
  • 找工作面试技巧
  • Jackson无缝替换Fastjson
  • JVM 内存分析工具 MAT及实践
  • jupyter notebook 不知道密码,怎么登录解决办法
  • 软著项目推荐 深度学习中文汉字识别
  • WEB渗透—反序列化(七)
  • 牛客网刷题笔记四 链表节点k个一组翻转
  • 【数据结构】图<简单认识图>
  • Git介绍和基础命令解析
  • 力扣hot100 和为 K 的子数组 前缀和
  • 6.12找树左下角的值(LC513-M)