【入门级-算法-6、排序算法: 计数排序】

计数排序核心思想:通过 "统计待排序元素的出现次数"然后根据这些计数信息将元素放置到正确的位置,来确定每个元素的最终位置,而非通过元素间的比较完成排序。它仅适用于元素值范围已知且较为集中的场景(例如年龄、考试分数、商品 ID 等),时间复杂度可达到线性级别,效率远高于冒泡、归并等比较型排序,时间复杂度可以达到 O (n + k)(其中 n 是元素个数,k 是元素值的范围)。

计数排序的基本步骤:

确定范围:找出待排序数组中的最大值和最小值,计算出元素值的范围(k = 最大值 - 最小值 + 1)

统计计数:创建一个计数数组,统计每个元素出现的次数

计算前缀和:将计数数组转换为前缀和数组,以确定每个元素在结果数组中的位置

构建结果:从原数组末尾开始遍历,根据前缀和数组将元素放置到结果数组的对应位置

示例代码:

#include <stdio.h>

#include <stdlib.h>

#include <limits.h>

// 计数排序函数

void countingSort(int arr\[\], int n) {

if (n <= 0) return; // 空数组直接返回

// 步骤1:找出数组中的最小值和最大值

int min = INT_MAX;

int max = INT_MIN;

for (int i = 0; i < n; i++) {

if (arri < min) min = arri;

if (arri > max) max = arri;

}

// 计算值的范围

int range = max - min + 1;

// 步骤2:创建计数数组并初始化

int* count = (int*)calloc(range, sizeof(int));

if (count == NULL) {

printf("内存分配失败\n");

return;

}

// 步骤3:统计每个元素出现的次数

for (int i = 0; i < n; i++) {

countarr\[i - min]++;

}

// 步骤4:计算前缀和,确定元素的最终位置

for (int i = 1; i < range; i++) {

counti += counti - 1;

}

// 步骤5:创建结果数组

int* output = (int*)malloc(n * sizeof(int));

if (output == NULL) {

printf("内存分配失败\n");

free(count);

return;

}

// 步骤6:反向遍历原数组,构建有序数组(保证稳定性)

for (int i = n - 1; i >= 0; i--) {

int index = arri - min;

outputcount\[index - 1] = arri;

countindex--;

}

// 步骤7:将排序结果复制回原数组

for (int i = 0; i < n; i++) {

arri = outputi;

}

// 释放动态分配的内存

free(count);

free(output);

}

// 辅助函数:打印数组

void printArray(int arr\[\], int size) {

for (int i = 0; i < size; i++) {

printf("%d ", arri);

}

printf("\n");

}

// 主函数用于测试

int main() {

int arr\[\] = {4, 2, 2, 8, 3, 3, 1, -1, 0, -1, 5};

int n = sizeof(arr) / sizeof(arr0);

printf("排序前的数组: ");

printArray(arr, n);

countingSort(arr, n);

printf("排序后的数组: ");

printArray(arr, n);

return 0;

}

相关推荐
七牛云行业应用4 分钟前
Muse Spark Open 发布:Meta 称其为美国最强开放权重模型,816B 参数如何落地
算法
esop轻Mes看板亮灯分拣ESD静电安23 分钟前
产线“最后一米”的破局密码:ESOP与MES的区别与深度协同
算法
动词ing24 分钟前
[题目练习】三数之和
数据结构
陈天伟教授31 分钟前
《数据处理和标注技术》课程能力图谱
人工智能·算法
LMT_Lanmantech34 分钟前
HyperWorks许可:almutil显示Unit满了,数据到底准不准?
运维·服务器·算法
YSL07012435 分钟前
一文通关-----栈和队列
开发语言·数据结构
禁默44 分钟前
论文解读与思考:基于场所地图的标识感知机器人探索方法及工程参考的价值
人工智能·深度学习·算法·机器人
维克兜率天1 小时前
【维克】统计套利建模:从因子到信号的完整流程
android·开发语言·python·算法·kotlin
Zentceh1 小时前
PixelClean 这类 AI 降噪算法是怎么工作的?从 RAW 域到 GAN 色彩重建的技术拆解
图像处理·人工智能·科技·算法·计算机视觉·车载系统·智能硬件
用户0390614707191 小时前
无感观测器理论模型(NTSM-SMO-PLL 与 SMO-PLL)
算法