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

大顶堆:

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

核心性质

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

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

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;
}
相关推荐
en.en..19 分钟前
数据结构考点解析:逻辑闭环与存储循环辨析
数据结构
考虑考虑26 分钟前
Excel导入时产生特殊字符处理
java·后端·java ee
蛋先生DX38 分钟前
你瘦不下来但大模型可以:量化原理了解一下
深度学习·算法·llm
Scabbards_1 小时前
面试Leetcode - Heap 堆
java·leetcode·面试
程序员清风1 小时前
专业再升级!程序员专属显示器明基RD280UG上手实测!
java·后端·面试
(╹◡╹)2 小时前
18.剪枝
算法·机器学习·剪枝
布莱克6053 小时前
数据库索引分类:数据结构、物理存储与逻辑角度详解
数据结构·数据库
Lam Tang3 小时前
APS 系列文章 08
java·代理模式
Fa_Mian_Tuan3 小时前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
hanhahai3 小时前
指针与函数(函数指针与指针函数)
算法