当前位置: 首页 > news >正文

【入门级-算法-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 (arr[i] < min) min = arr[i];
if (arr[i] > max) max = arr[i];
}
// 计算值的范围
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++) {
count[arr[i] - min]++;
}
// 步骤4:计算前缀和,确定元素的最终位置
for (int i = 1; i < range; i++) {
count[i] += count[i - 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 = arr[i] - min;
output[count[index] - 1] = arr[i];
count[index]–;
}
// 步骤7:将排序结果复制回原数组
for (int i = 0; i < n; i++) {
arr[i] = output[i];
}
// 释放动态分配的内存
free(count);
free(output);
}

// 辅助函数:打印数组
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf(“%d “, arr[i]);
}
printf(”\n”);
}

// 主函数用于测试
int main() {
int arr[] = {4, 2, 2, 8, 3, 3, 1, -1, 0, -1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
printf("排序前的数组: ");
printArray(arr, n);
countingSort(arr, n);
printf("排序后的数组: ");
printArray(arr, n);
return 0;
}

http://www.dtcms.com/a/412084.html

相关文章:

  • 传奇网站架设方法做网站赔钱了
  • 智慧停车大屏改造详细修改文档
  • 做网站需要icp吗园林景观设计平面图
  • Visual Studio 插件 - 喝水提醒
  • 景区网站建设 现状中俄跨境电商平台有哪些
  • 福建省教师空间建设网站稿定设计网页版登录
  • 摄影网站都有什么网站应用系统设计方案
  • 2014-2024高考真题考点分布详细分析(另附完整高考真题下载)
  • 天津站内关键词优化手机搜索引擎
  • asp网站源码东莞商城网站建设公司
  • 京东商城网站地址是多少深圳龙华区大浪街道
  • 百度竞价推广托管长春seo排名公司
  • 论文《A Recurrent Latent Variable Model for Sequential Data》翻译
  • 笔记(C++篇)—— Day 12
  • 建立网站准备工作凡科网站源码下载
  • 将数组最后一位元素移动到数组首元素位置,其余元素依次向后移动一位
  • 建站快车优势扬州、常州、扬州、泰州
  • 帮别人做网站音乐推广平台有哪些
  • 静态代理与动态代理
  • vue3+vite,引入阿里巴巴svg图标,自定义大小颜色
  • 网站搭建哪家公司最好有哪些营销型网站
  • LoRa大模型微调
  • 如何创建网站的步骤深圳建站网站网站公司
  • 松江新城做网站做诱导网站
  • Java Web 开发实用技巧与经验总结
  • 设计网站欣赏苏州企业建设网站
  • 南通网站定制上海网站建设选缘魁 -企查
  • 网站突然在百度消失了网络营销思想的网站改版计划
  • 【MySQL 高阶】MySQL 架构与存储引擎全面详解
  • 转行AI产品如何准备面试