堆排序

通过将无序表转化为堆,可以直接找到表中最大值或者最小值,然后将其提取出来,令剩余的记录再重建一个堆,

取出次大值或者次小值,如此反复执行就可以得到一个有序序列,此过程为堆排序。

思路:

1.创建一个堆 H[0……n-1];

2.把堆首(最大值)和堆尾互换;

3.把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;

4.重复步骤 2,直到堆的尺寸为 1。

代码实现:

  1. #include <iostream>
  2. #include <random>
  3. using namespace std;
  4. template <typename T> //整數或浮點數皆可使用
  5. void max_heapify(T* arr, int start, int end) {
  6. // 建立父節點指標和子節點指標
  7. int dad = start;
  8. int son = dad * 2 + 1;
  9. while (son <= end) { // 若子節點指標在範圍內才做比較
  10. if (son + 1 <= end && arr[son] < arr[son + 1]) // 先比較兩個子節點大小,選擇最大的
  11. son++;
  12. if (arr[dad] > arr[son]) // 如果父節點大於子節點代表調整完畢,直接跳出函數
  13. return;
  14. else { // 否則交換父子內容再繼續子節點和孫節點比較
  15. swap(arr[dad], arr[son]);
  16. dad = son;
  17. son = dad * 2 + 1;
  18. }
  19. }
  20. }
  21. template <typename T> //整數或浮點數皆可使用
  22. void heap_sort(T* arr, int len) {
  23. // 初始化,i從最後一個父節點開始調整
  24. for (int i = len / 2 - 1; i >= 0; i--)
  25. max_heapify(arr, i, len - 1);
  26. // 先將第一個元素和已经排好的元素前一位做交換,再從新調整(刚调整的元素之前的元素),直到排序完畢
  27. for (int i = len - 1; i > 0; i--) {
  28. swap(arr[0], arr[i]);
  29. max_heapify(arr, 0, i - 1);
  30. }
  31. }
  32. int main()
  33. {
  34. int arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
  35. int len = (int) sizeof(arr) / sizeof(*arr);
  36. heap_sort(arr,len);
  37. for (int i = 0; i < len; i++)
  38. cout << arr[i] << ' ';
  39. cout << endl;
  40. double arrf[] = { 17.5, 19.1, 0.6, 1.9, 10.5, 12.4, 3.8, 19.7, 1.5, 25.4, 28.6, 4.4, 23.8, 5.4 };
  41. len = (int) sizeof(arrf) / sizeof(*arrf);
  42. heap_sort(arrf,len);
  43. for (int i = 0; i < len; i++)
  44. cout << arrf[i] << ' ' << endl;
  45. return 0;
  46. }

十大经典排序之堆排序(C++实现)的更多相关文章

  1. 十大经典排序算法(python实现)(原创)

    个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...

  2. 十大经典排序算法+sort排序

    本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...

  3. 十大经典排序算法的 JavaScript 实现

    计算机领域的都多少掌握一点算法知识,其中排序算法是<数据结构与算法>中最基本的算法之一.排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大 ...

  4. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  5. 一文搞定十大经典排序算法(Java实现)

    本文总结十大经典排序算法及变形,并提供Java实现. 参考文章: 十大经典排序算法总结(Java语言实现) 快速排序算法—左右指针法,挖坑法,前后指针法,递归和非递归 快速排序及优化(三路划分等) 一 ...

  6. 十大经典排序【Java实现,手工作坊式】

    终于把排序这个硬骨头,但是又很基础的知识点,自己手撕了一遍!之前,使用Python看着算法导论的书手撕过一遍,印象不是很深刻,容易忘记!好记性不如烂笔头!多自己思考解决问题 1,交换类CAS[最简单] ...

  7. 十大经典排序算法最强总结(含JAVA代码实现)(转)

    十大经典排序算法最强总结(含JAVA代码实现)   最近几天在研究排序算法,看了很多博客,发现网上有的文章中对排序算法解释的并不是很透彻,而且有很多代码都是错误的,例如有的文章中在“桶排序”算法中对每 ...

  8. 十大经典排序算法(Python,Java实现)

    参照:https://www.cnblogs.com/wuxinyan/p/8615127.html https://www.cnblogs.com/onepixel/articles/7674659 ...

  9. 十大经典排序算法(Javascript实现)

    前言 总括: 本文结合动图详细讲述了十大经典排序算法用Javascript实现的过程. 原文博客地址:十大经典排序算法 公众号:「菜鸟学前端」,回复「666」,获取一揽子前端技术书籍 人生有情泪沾衣, ...

  10. python实现十大经典排序算法

    Python实现十大经典排序算法 代码最后面会给出完整版,或者可以从我的Githubfork,想看动图的同学可以去这里看看: 小结: 运行方式,将最后面的代码copy出去,直接python sort. ...

随机推荐

  1. onnxruntime源码解析之C接口简介

    一.C接口 1. 简介 其他语言的接口都是在C接口的基础上,进一步的封装. C的接口头文件为:onnxruntime_c_api.h 头文件内包含了详细的注释和说明. 总体上,除了一些数据结构的定义, ...

  2. linux mint 常用软件安装

    deepin版 qq 微信 迅雷安装 https://github.com/wszqkzqk/deepin-wine-ubuntu inkscape sudo add-apt-repository p ...

  3. js实现光标移入和移出元素事件

    js实现光标移入和移出元素事件 效果实现: 代码: i标签添加事件 var onmouse = 'onmouseover = "overshow(this)" onmouseout ...

  4. HTML学习笔记3----制作一个简易网站

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  5. Android Studio打开现有的项目,Android自带的类、函数(方法)属性等爆红,含解决方式

    如上图,Android 自带的 setContentView 爆红,XML文件内 android:相关的属性(如android:layout_width) 爆红 原因: 使用Android Studi ...

  6. PO 锁

    SAP NetWeaver Administrator->可用性和监控->资源监控->锁

  7. 微信小程序 - canvas实现多行文本 ,实现文本断行

    1.canvas绘制文本坑点 绘制的文本不管多长,永远只有一行,不会断行. 2.解决思路 根据每行文本字数来断行,超出的就向下排列. 由于 canvas绘制文本的语法如下: context.fillT ...

  8. WEB漏洞扫描工具之OWASP ZAP

    添加扫描策略 使用新建的扫描策略

  9. 批量导入数据到redis--速度极快

    ##批量导入数据到redis1)创建含有redis命令的文本并转换格式vim test.txt-------------------------HMSET provinceblack:14716261 ...

  10. 【剑指Offer】【链表】链表中环的入口结点

    题目:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. A:创建两个指针,一个pFast一个pSlow指向链头,pFast一次走2步,pSlow一次走1步,如果两个指针必相遇 ...