Consolexin's blog Consolexin's blog
首页
  • 算法基础

    • 图论
    • 字符串
    • 动态规划
    • 二分
    • 滑动窗口
    • 排序
  • Project

    • CppServer
  • 相关书籍

    • 现代C++编程
  • 书籍

    • SQL必知必会
    • MySQL必知必会
分类
标签
归档
GitHub (opens new window)

Consolexinhun

小学生
首页
  • 算法基础

    • 图论
    • 字符串
    • 动态规划
    • 二分
    • 滑动窗口
    • 排序
  • Project

    • CppServer
  • 相关书籍

    • 现代C++编程
  • 书籍

    • SQL必知必会
    • MySQL必知必会
分类
标签
归档
GitHub (opens new window)
  • 图论

  • 字符串

  • 动态规划

  • 二分

  • 滑动窗口

  • 排序

    • 简单排序
    • 希尔排序
    • 归并排序
    • 快速排序
    • 堆排序
    • 算法
    • 排序
    consolexinhun
    2021-12-14
    目录

    堆排序

    笔记

    首先构建初始堆,如果是从小到大,那么构建大顶堆,否则构建小顶堆

    将堆顶与末尾元素置换

    重新调整以0号节点为顶点的堆

    注意

    不稳定排序

    //
    // Created by Administrator on 2021/12/13.
    //
    
    #include<bits/stdc++.h>
    
    using namespace std;
    
    
    /**
     * 堆排序
     * */
    
    /**
     * 调整堆
     * @param a
     * @param k 非叶子节点下标,该堆以k为顶点
     * @param len 整个数组的长度
     */
    void adjust(int a[], int k, int len) {
        int temp = a[k]; // 记录非叶子节点,它作为该次调整的根
        for(int i = 2*k+1; i < len; i = 2*i+1) {
            if(i+1 < len && a[i] < a[i+1]) {
                i++;
            }
            if(a[i] > temp) {
                a[k] = a[i];
                k = i;
            }
            else {
                break;
            }
        }
        a[k] = temp;
    }
    void heap_sort(int a[], int len) {
        // 建堆
        for(int k = len/2-1; k >= 0; k--) { // 从后往前选择第一个非叶子节点,调整堆
            adjust(a, k, len);
        }
    
        for(int j = len-1; j > 0; j--) { // 将堆顶与末尾交换,然后重新调整以0为顶点的堆
            swap(a[j], a[0]);
            adjust(a, 0, j);
        }
    }
    
    int main() {
        int a[] = {9, 3, 1, 4, 2, 7, 8, 6, 5};
    
        int len = sizeof(a)/sizeof(a[0]);
    
        heap_sort(a, len);
    
        for(int i = 0; i < len; i++) {
            printf("%d%c", a[i], " \n"[i==len-1]);
        }
        return 0;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59

    # 参考链接

    堆排序 (opens new window)

    编辑 (opens new window)
    上次更新: 2025/05/21, 06:42:57
    快速排序

    ← 快速排序

    最近更新
    01
    6-其他操作
    05-20
    02
    4-联结
    05-20
    03
    7-管理
    05-20
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 Consolexinhun | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式
    ×