个人笔记--大顶堆和基数排序

大顶堆:

大顶堆 是一种特殊的完全二叉树数据结构,满足以下性质:

核心性质

  • 堆序性 :每个节点的值都 大于或等于 其左右子节点的值

  • 完全二叉树:除了最后一层,其他层都是满的,且最后一层节点从左到右排列

cs 复制代码
#include<stdio.h>
void heapify(int arr[],int length,int parent){
    int child=2*parent+1;
    while(child<length){
        int rchild=child+1;
        if(rchild<length && arr[rchild]>arr[child]{
            child=rchild;
        }
        if(arr[parent]<arr[child]){
            int temp=arr[parent];
            arr[parent]=arr[child];
            arr[child]=temp;
            parent=child;
            child=2*parent+1;
        }else{
            break;
        }
    }
}
int main(){
    int arr[]={5,7,4,2,0,3,1,6};
    int length=sizeof(arr)/sizeof(int);
    //建堆,从最后一个非叶子节点开始
    for(int p=length;p>=0;p--){
        heapify(arr,length,p);
    }
    //排序
    for(int i=length-1;i>0;i--){
        int temp=arr[0];
        arr[0]=arr[i];
        arr[i]=temp;
        heapify(arr,i,0);//调整前i个元素
    }
    //打印
    for(int i=0;i<length;i++){
        printf("%d",arr[i]);
    }
    printf("\n");
    return 0;
}

基数排序:基数排序 是一种非比较型整数排序算法,通过按位(个位、十位、百位...)分配和收集元素来实现排序。

cs 复制代码
#include <stdio.h>
#include <stdlib.h>    // for malloc/free

void radixSort(int arr[], int length) {
    // 1. 找最大值(用于确定最大位数)
    int max = arr[0];
    for (int i = 1; i < length; i++) {
        if (arr[i] > max) max = arr[i];
    }

    // 2. 计算最大值的位数
    int maxLength = 0;
    int temp = max;
    while (temp > 0) {
        temp /= 10;
        maxLength++;
    }

    // 若最大值是0,直接返回(或位数计为1)
    if (maxLength == 0) maxLength = 1;

    // 3. 定义桶(使用动态分配)
    // 注意:int (*bucket)[length] 这种写法在某些编译器可能不支持变长数组
    // 更安全的方式是使用 int** 或者一维数组模拟
    int (*bucket)[length] = malloc(10 * sizeof(*bucket));
    if (bucket == NULL) {
        perror("malloc failed");
        return;
    }

    int bucketCount[10] = {0};

    int n = 1;  // 用于获取当前位的除数(1, 10, 100, ...)
    
    // 4. 按位进行排序
    for (int digit = 0; digit < maxLength; digit++) {
        // 清空桶计数器(每轮开始前必须为0)
        for (int i = 0; i < 10; i++) bucketCount[i] = 0;
        
        // -------- 分配阶段:将元素放入对应的桶 --------
        for (int i = 0; i < length; i++) {
            int currentDigit = (arr[i] / n) % 10;  // 获取当前位上的数字
            bucket[currentDigit][bucketCount[currentDigit]++] = arr[i];
        }
        
        // -------- 收集阶段:按顺序从桶中取出元素 --------
        int index = 0;
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < bucketCount[i]; j++) {
                arr[index++] = bucket[i][j];
            }
        }
        
        // 更新除数,进入下一位
        n *= 10;
    }
    
    // 5. 释放动态分配的内存
    free(bucket);
}

// 测试函数
int main() {
    int arr[] = {170, 45, 75, 90, 802, 24, 2, 66};
    int length = sizeof(arr) / sizeof(arr[0]);
    
    printf("排序前: ");
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    radixSort(arr, length);
    
    printf("排序后: ");
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}
相关推荐
高铭杰1 小时前
Golang sync.Mutex实现原理学习
java·学习·golang
白狐_7981 小时前
【408计算机网络|第04章·下|408-CN-04B】网络层(下):路由算法、RIP、OSPF、BGP、IPv6与路由器
计算机网络·算法·智能路由器
donoot2 小时前
PaddleOCR + PyMuPDF 生成【全兼容双层 PDF】完整实操指南
人工智能·算法·pymupdf·paddleocr·双层pdf
paeamecium3 小时前
【PAT甲级真题】- Rational Sum (20)
数据结构·c++·python·算法·pat考试·pat
Highcharts.js9 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
头发还在的女程序员11 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats11 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我1234512 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
拳里剑气13 小时前
C++算法:BFS解决FloodFill算法
c++·算法·bfs·宽度优先