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

大顶堆:

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

核心性质

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

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

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;
}
相关推荐
凤山老林3 分钟前
Spring Boot DDD 分层架构落地:领域模型、聚合根与事件驱动的业务实战
java·spring boot·架构
自强的小白5 分钟前
MYbatis-plus(自定义sql)
java·sql·mybatis
古法安卓5 分钟前
Android-Ext4文件系统问题排查
android·java·android studio
Escalating_xu8 分钟前
【C 语言】深入理解指针(3):字符指针、数组指针、二维数组传参、函数指针与转移表
java·c语言·开发语言
不正经的码狗25 分钟前
Java 开发环境搭建与 Eclipse 使用速通教程
java·开发语言·eclipse
用户81818706274626 分钟前
第37章 Java应用在K8s里的经典坑:容器内存/CPU limit与JVM参数不匹配导致的OOMKilled
java·后端
yi01136 分钟前
DAY17: LeetCode 139|单词拆分:从“把单词删掉”到用 DP 记录合法切口
人工智能·笔记·python·算法·leetcode·动态规划
马剑威(威哥爱编程)39 分钟前
【AI全栈后端12-03】Spring Boot 用多模型路由把智能客服成本降下来
java·人工智能·spring boot
霸道流氓气质43 分钟前
AI模型幻觉检测与抑制完全指南:从规则引擎到RAG对比的Java生产级实战
java·开发语言·人工智能
陈希瑞1 小时前
LongCat-2.5-Preview 的web逆向能力实测
人工智能·算法·wasm