前言

计数排序是一种非比较性的排序算法,适用于排序一定范围内的整数。它的基本思想是通过统计每个元素的出现次数,然后根据元素的大小依次输出排序结果。

实现原理

  1. 首先找出待排序数组中的最大值max和最小值min。
  2. 创建一个长度为max-min+1的数组count,用于统计每个元素出现的次数。
  3. 遍历待排序数组,将每个元素的出现次数记录在count数组中。
  4. 根据count数组和min值,得到每个元素在排序结果中的起始位置。
  5. 创建一个与待排序数组长度相同的临时数组temp,用于存储排序结果。
  6. 再次遍历待排序数组,根据count数组和min值确定每个元素在temp数组中的位置,并将其放入。
  7. 将temp数组中的元素复制回待排序数组,排序完成。

代码实现

        public static void CountingSort(int[] array)
        {
            int arrayLength = array.Length;
            if (arrayLength <= 1) return;

            int min = array[0];
            int max = array[0];

            //找出最大值和最小值
            for (int i = 1; i < arrayLength; i++)
            {
                if (array[i] < min) min = array[i];
                if (array[i] > max) max = array[i];
            }

            //统计每个元素出现的次数
            int[] count = new int[max - min + 1];

            //统计每个元素出现的次数
            for (int i = 0; i < arrayLength; i++)
            {
                count[array[i] - min]++;
            }

            //根据count数组和min值确定每个元素的起始位置
            for (int i = 1; i < count.Length; i++)
            {
                count[i] += count[i - 1];
            }

            //存储排序结果
            int[] temp = new int[arrayLength];

            //根据count数组和min值确定每个元素在temp数组中的位置
            for (int i = arrayLength - 1; i >= 0; i--)
            {
                int index = count[array[i] - min] - 1;
                temp[index] = array[i];
                count[array[i] - min]--;
            }

            //将排序结果复制回原数组
            for (int i = 0; i < arrayLength; i++)
            {
                array[i] = temp[i];
            }
        }

        public static void CountingSortRun()
        {
            int[] array = { 19, 27, 46, 48, 50, 2, 4, 44, 47, 36, 38, 15, 26, 5, 3, 99, 888, 0, -1 };
            Console.WriteLine("排序前数组:" + string.Join(", ", array));

            CountingSort(array);

            Console.WriteLine("排序后数组:" + string.Join(", ", array));
        }

运行结果

总结

计数排序的时间复杂度为O(n+k),其中n为待排序数组的长度,k为最大值和最小值之差。计数排序的优势在于对范围较小的整数排序时,速度较快且稳定,但受限于需要统计每个元素的出现次数,不适用于范围过大或包含负数的情况。

C#计数排序算法的更多相关文章

  1. 计数排序算法——时间复杂度O(n+k)

    计数排序 计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出.它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于 ...

  2. 算法-java代码实现计数排序

    计数排序   第10节 计数排序练习题 对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3], ...

  3. 排序算法的c++实现——计数排序

    任何比较排序算法的时间复杂度的上限为O(NlogN), 不存在比o(nlgN)更少的比较排序算法.如果想要在时间复杂度上超过O(NlogN)的时间复杂度,肯定需要加入其它条件.计数排序就加入了限制条件 ...

  4. 惊!世界上竟然有O(N)时间复杂度的排序算法!计数排序!

    啥?你以为排序算法的时间复杂度最快也只能O(N*log(N))了? O(N)时间复杂度的排序算法听说过没有?计数排序!!它是世界上最快最简单的算法!!! 计数排序算法操作起来只有三步,看完秒懂! 根据 ...

  5. counting sort 计数排序

    //counting sort 计数排序 //参考算法导论8.2节 #include<cstdio> #include<cstring> #include<algorit ...

  6. 排序算法以及其java实现

    一.术语了解 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成: 外排序:由 ...

  7. Java实现基于桶式排序思想和计数排序思想实现的基数排序

    计数排序 前提:待排序表中的所有待排序关键字必须互不相同: 思想:计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键码比该记录的关键码小,假设针对某一个记录,统计出的计数值 ...

  8. Java实现各种内部排序算法

    数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将 ...

  9. 第2章 排序 | 第10节 计数排序练习题 && 基数排序

    对于一个int数组,请编写一个计数排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 计数排序 ...

  10. 排序算法 JavaScript

    一.冒泡排序 算法介绍: 1.比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.第一轮把最大的元素放到了最后面. 3.由于每次排序最后一个都是最大的,所以之后按照步骤1排序最后一个元素不用比 ...

随机推荐

  1. 一个跨平台的`ChatGPT`悬浮窗工具

    一个跨平台的ChatGPT悬浮窗工具 使用avalonia实现的ChatGPT的工具,设计成悬浮窗,并且支持插件. 如何实现悬浮窗? 在使用avalonia实现悬浮窗也是非常的简单的. 实现我们需要将 ...

  2. nacos连接不上配置的坑

    问题: 今天在使用nacos时,发现怎么样都连接不上配置 思路: 毋庸置疑这个肯定是配置问题,下面是我现在的配置 nacos: username: nacos password: nacos serv ...

  3. Java版人脸跟踪三部曲之三:编码实战

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 作为<Java版人脸跟踪三部曲> ...

  4. 【SpringCloud】 Eureka

    Eureka 父工程 核心依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=& ...

  5. Codeforces Round #875 (Div. 2) A-D

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...

  6. 将SQL从phpmyadmin导入到自己的Navicat

    数据库名称太有指向性了 容易把自己给干没了 一码得码的一塌糊涂 就不放图了 进入你的phpmyadmin 注意一定要好好的进到数据库里面 点击导出 如果提示是 正在导出数据库"{你的数据库名 ...

  7. 【译】Visual Studio 2022 中的 Web API 开发

    在 Visual Studio 2022 中,Web 开发人员的主要场景之一是使用 ASP.NET Core 创建 Web API.在 Visual Studio 2022 17.6 的最新预览版中, ...

  8. zabbix 修改模板中单个主机的触发器

    参考文档:zabbix 修改模板中单个主机的触发器 在主机的 Triggers,克隆后修改,再disable原来的触发器.

  9. rsync 命令

    linux上的rsync命令详解 15个rsync命令实施 -z: --compress 使用压缩机制 -v: --verbose 打印详细信息 -r: --recursive 以递归模式同步子目录 ...

  10. 搜索(DFS/BFS)

    广度优先搜索(BFS) 基本要点: - 利用队列(先进先出) - 一层一层搜索 - 适合于连通块的搜索 - 任何的BFS都可以转化为对树的广搜 基本流程: - 选择搜索的起点,起点入队,起点标记为已访 ...