非比较排序【计数排序】代码实现

简介: 今天是我们学习的最后一个排序内容,计数排序,接下来之后我们学习一些大厂的面试题。

引言:

今天是我们学习的最后一个排序内容,计数排序,接下来之后我们学习一些大厂的面试题。


计数排序实现

1. 大致原理:计数排序不是基于比较的排序,所以它的排序效率是线性的,在特定的场景下(已知数组的最大最小值,切数组元素整体量不是很大的情况下)排序效率极高,找到待排序列中最大最小的元素,然后以此确定临时空间的大小,在临时空间中,以待排序列组中元素的大小为下标,该元素出现的次数为该下标对应的元素,根据临时空间的统计结果,重新对元素进行拷贝。


2. 动图演示如下:


40.gif

40.gif

3.代码实现

详解每一步

//2.7.7 计数排序(非比较排序)
//时间复杂度:O(N+range) =>标准的是 N+N+range;(表示:范围小就快,范围大就慢) 适用于范围集中的一组整形排序,并且只适用于整形,不像是上述的代码,就算不是整形也可以排,只要可以比较大小就可以
//空间复杂度:O(range)     思想很强,但是作用局限
#include<string.h>
void CountSort(int* arr, int n)
{
  int max = arr[0];
  int min = arr[0];
  int i;
  for (i = 0; i < n; i++)
  {
    //遍历比较,获取此数组中的最大值和最小值
    if (arr[i] > max)
    {
      max = arr[i];
    }
    if (arr[i] < min)
    {
      min = arr[i];
    }
  }
  //算此时的我们要创建的数组的范围的大小
  int range = max - min + 1;
  //算出了范围,我们就可以创建一个此范围的数组
  int* count = (int*)malloc(sizeof(int) * range);
  if (count == NULL)
  {
    printf("malloc fail\n");
    exit(-1);
  }
  else
  {
    //此时就是根据计数排序的原理,统计我要排的元素出现的次数
    //代码如下:
    memset(count, 0, sizeof(int) * range);//这个就是一个函数,可以用来初始化一个数组,让数组中放上自己想要放的东西的(因为我此时想要将我的数组初始化为0,所以我要将我创建的整个数组range给memset为0)
    for (i = 0; i < n; i++)
    {
      count[arr[i] - min]++;//此时的这个(-min)就是为了映射出一个相对位置,因为只有相对位置才可以进行排序
      //这个就是按照原理:一个数出现一次就在这个数相应的下标处加1,所以这个就是对下边加加,对数组中的元素进行统计的关键代码
      //这步不明白就是画一个图 例:此时的arr数组中的元素是 :    4 4 6 8 9 3 3 0 0 
                                   //我malloc出来的数组是:   0 0 0 0 0 0 0 0 0 0
                                  // 数组的下标是:           0 1 2 3 4 5 6 7 8
            //所以此时的count[arr[i]]++;的意思就是,arr[0]的位置处的数据是4,那么此时就对数组count[4]的位置处进行加加,arr[1]一样,arr[2]是6,我就对count[6]的位置进行加加
                                   //以此类推:最后得到       2 0 0 2 2 0 1 0 1 1   
      //然后按照count中的数据进行排序:得到                   0 0 3 3 4 4 6 8 9    这样我们就得到了有序的数组了
    }                 
    //统计完次数之后我们就可以将count数组给真正的拿过来排序了
    int j = 0;
    for (i = 0; i < range; i++)
    {
      while (count[i])
      {
        arr[j++] = i + min;
        count[i]--;
      }
    }
  }
  free(count);


相关文章
|
14天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
6天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
|
9天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
838 25
|
8天前
|
机器学习/深度学习 人工智能 搜索推荐
万字长文深度解析最新Deep Research技术:前沿架构、核心技术与未来展望
近期发生了什么自 2025 年 2 月 OpenAI 正式发布Deep Research以来,深度研究/深度搜索(Deep Research / Deep Search)正在成为信息检索与知识工作的全新范式:系统以多步推理驱动大规模联网检索、跨源证据。
576 46
|
2天前
|
监控 BI 数据库
打工人救星!来看看这两家企业如何用Quick BI让业务更高效
Quick BI专业版监控告警助力企业高效运作,通过灵活配置规则与多渠道推送,让数据异常早发现、快响应,推动业务敏捷决策与持续增长。
打工人救星!来看看这两家企业如何用Quick BI让业务更高效
|
8天前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
562 41