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

大顶堆:

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

核心性质

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

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

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;
}
相关推荐
hansang_IR1 分钟前
【题解】 [省选联考 2021 A/B 卷] 卡牌游戏
c++·算法
这个DBA有点耶27 分钟前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康32 分钟前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题
lzx_00234 分钟前
C++11(一)
开发语言·c++·算法
529宝宝起名网43 分钟前
用 Python 实现名字寓意评分算法:基于 NLP 语义分析的名字内涵深度评估
python·算法·自然语言处理
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之过滤器与过滤器链
java·开发语言·spring
谢尔登1 小时前
01_Java基础速通
java·开发语言
lemon_sjdk2 小时前
javafx-Image图像(2)
java·javafx
带多刺的玫瑰2 小时前
Leecode#26刷题之删除有序数组中的重复项
数据结构·算法·leetcode
小七在进步2 小时前
C++入门(2)
java·jvm·c++