C++ 计数排序实例详解

发布时间 - 2026-01-11 02:12:18    点击率:

计数排序

             计数排序是一种非比较的排序算法

优势:

             计数排序在对于一定范围内的整数排序时,时间复杂度为O(N+K)  (K为整数在范围)快于任何比较排序算法,因为基于比较的排序时间复杂度在理论上的上下限是O(N*log(N))。

缺点:

             计数排序是一种牺牲空间换取时间的做法,并且当K足够大时O(K)>O(N*log(N)),效率反而不如比较的排序算法。并且只能用于对无符号整形排序。

时间复杂度:

            O(N)  K足够大时为O(K)

空间复杂度:

           O(最大数-最小数)

性能:

           计数排序是一种稳定排序

代码实现:

#include <iostream> 
#include <Windows.h> 
#include <assert.h> 
 
using namespace std; 
 
//计数排序,适用于无符号整形 
void CountSort(int* a, size_t size) 
{ 
  assert(a); 
  size_t max = a[0]; 
  size_t min = a[0]; 
  for (size_t i = 0; i < size; ++i) 
  { 
    if (a[i] > max) 
    { 
      max = a[i]; 
    } 
    if (a[i] < min) 
    { 
      min = a[i]; 
    } 
  } 
  size_t range = max - min + 1;   //要开辟的数组范围 
  size_t* count = new size_t[range]; 
  memset(count, 0, sizeof(size_t)*range);  //初始化为0 
  //统计每个数出现的次数 
  for (size_t i = 0; i < size; ++i)   //从原数组中取数,原数组个数为size 
  { 
    count[a[i]-min]++; 
  } 
  //写回到原数组 
  size_t index = 0; 
  for (size_t i = 0; i < range; ++i)  //从开辟的数组中读取,开辟的数组大小为range 
  { 
    while (count[i]--) 
    { 
      a[index++] = i + min; 
    } 
  } 
  delete[] count; 
} 
 
void Print(int* a, size_t size) 
{ 
  for (size_t i = 0; i < size; ++i) 
  { 
    cout << a[i] << " "; 
  } 
  cout << endl; 
} 
#include "CountSort.h" 
 
void TestCountSort() 
{ 
  int arr[] = { 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 4, 5, 8, 9, 5, 11, 11, 22, 12, 12 }; 
  size_t size = sizeof(arr) / sizeof(arr[0]); 
  CountSort(arr, size); 
  Print(arr, size); 
} 
 
int main() 
{ 
  TestCountSort(); 
  system("pause"); 
  return 0; 
} 


感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# C++  # 计数排序  # 计数排序详解  # C++计数排序详解  # 是一种  # 适用于  # 希望能  # 谢谢大家  # 理论上  # 数为  # 中取  # 组中  # 快于  # namespace  # Windows  # assert  # int  # void  # CountSort  # std  # gt  # pre  # log  # strong 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何正确下载安装西数主机建站助手?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何快速配置高效服务器建站软件?  Android 常见的图片加载框架详细介绍  大型企业网站制作流程,做网站需要注册公司吗?  Bootstrap整体框架之JavaScript插件架构  Laravel怎么使用artisan命令缓存配置和视图  如何在万网开始建站?分步指南解析  浅谈Javascript中的Label语句  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  如何在云指建站中生成FTP站点?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  Laravel如何使用Vite进行前端资源打包?(配置示例)  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  javascript日期怎么处理_如何格式化输出  C++时间戳转换成日期时间的步骤和示例代码  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何用PHP快速搭建高效网站?分步指南  活动邀请函制作网站有哪些,活动邀请函文案?  Laravel集合Collection怎么用_Laravel集合常用函数详解  如何撰写建站申请书?关键要点有哪些?  如何登录建站主机?访问步骤全解析  高防服务器:AI智能防御DDoS攻击与数据安全保障  javascript基本数据类型及类型检测常用方法小结  深圳网站制作的公司有哪些,dido官方网站?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  教你用AI润色文章,让你的文字表达更专业  Laravel如何优化应用性能?(缓存和优化命令)  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  如何快速登录WAP自助建站平台?  Laravel如何实现本地化和多语言支持?(i18n教程)  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  如何获取上海专业网站定制建站电话?  如何在阿里云部署织梦网站?  中山网站推广排名,中山信息港登录入口?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  长沙做网站要多少钱,长沙国安网络怎么样?  利用vue写todolist单页应用  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  高端智能建站公司优选:品牌定制与SEO优化一站式服务  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  微信小程序 scroll-view组件实现列表页实例代码