• 【排序】——堆排序


    堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。因此分为大根堆与小跟堆。

    大根堆:升序

    非叶子节点值大于等于左右子节点值:i \geq 2i && i \geq 2i+1

    小根堆:降序

    非叶子节点值小于等于左右子节点值:i \leq 2i && i \leq 2i +1

     堆排序:

    思路:

            1、构造n个数值的大根堆或小根堆

            2、将堆顶(最大或最小值),放至堆尾

            3、继续构造前n-1个数值,n = n-1 转1,如此循环

            4、输出 升序或降序 序列

    算法(大根堆)    i:根结点 2i:左节点 2i+1:右节点

    1、从非叶子节点开始调整 n/2

    2、在第2i个节点和第2i+1个节点中(左右节点)选最大值为X

    3、若第i个节点(根)小于X则二者交换

    4、交换后还需考虑以2i为根或2i+1为根的子树是否仍是堆,如不是则需要继续向下调整。

    5、 1~4 循环至堆顶为最大值

    6、堆顶堆尾交换元素,最大值放置最后。前 n - 1 继续调整,转 1; n == 0 结束

    注:图像不清晰,资源有上传视频:堆排序-CSDN直播

    代码

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. //<:升序,大根堆, >:降序,小根堆
    6. #define cmp <
    7. typedef int Node;
    8. void printHeap(vector<int>& heap){
    9. for(auto i: heap){
    10. cout << i << " ";
    11. }
    12. cout << endl;
    13. }
    14. void nodeAdjust(vector& tree, Node root, int size){
    15. int swapNode = root;
    16. //左右节点
    17. Node leftNode = root * 2 + 1;
    18. Node rightNode = root * 2 + 2;
    19. //叶子节点无需调整
    20. if(root > size/2-1 ) return;
    21. //左右节点与根结点进行比较,找极大或极小值
    22. if(leftNode < size && tree[swapNode] cmp tree[leftNode])
    23. swapNode = leftNode;
    24. if(rightNode < size && tree[swapNode] cmp tree[rightNode])
    25. swapNode = rightNode;
    26. if( tree[root] cmp tree[swapNode] ){
    27. //交换节点
    28. swap(tree[root], tree[swapNode]);
    29. //子节点被调整,则对应的子树堆被破坏需要重新调整
    30. nodeAdjust(tree, swapNode, size);
    31. }
    32. }
    33. //对于每个非叶子节点都进行调整,从后往前
    34. void heapAdjust(vector& tree, int size){
    35. for(int i = size/2-1; i >= 0; i --){
    36. nodeAdjust(tree, i, size);
    37. }
    38. }
    39. void heapSort(vector<int>& heap, int size){
    40. for(int i = 0; i < size; i++){
    41. //调整堆
    42. heapAdjust(heap, size - i);
    43. //将极值放最后
    44. swap(heap[0], heap[size - 1 - i ]);
    45. }
    46. }
    47. int main(){
    48. vector<int> tree = {2, 4, 1, 3, 6};
    49. heapSort(tree, tree.size());
    50. printHeap(tree);
    51. }

  • 相关阅读:
    反人类的施工作业,早应该被“干掉”
    Golang一日一库之regex
    [Cmake Qt]找不到文件ui_xx.h的问题?有关Qt工程的问题,看这篇文章就行了。
    2022/08/26 day11:高级数据类型
    计算机网络第三章 数据链路层
    山东大学单片机原理与应用实验 3.7LCD 1602显示实验
    Web基础与http协议
    misc corrupt
    记一次血淋淋的MySQL崩溃修复案例
    webrtc入门:12.Kurento下的RtpEndpoint和WebrtcEndpoint
  • 原文地址:https://blog.csdn.net/qq_32116001/article/details/127401340