前言

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

实现原理

  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. 如何在docker中创建postgresql数据库并使用prisma进行连接

    在docker中创建postgresql # docker 创建 postgres docker pull postgres # 创建容器 # ~/study/db/postgres 是本地的文件映射 ...

  2. 为什么 kubelet 不使用容器化部署?

    每日一问系列 为什么 kubelet 不使用容器化部署? 通过脚本(shell/ansible 等)在节点上部署 kubelet 服务时,涉及 kubelet 进程 service 启动配置.证书等, ...

  3. JVM GC配置指南

    本文旨在简明扼要说明各回收器调优参数,如有疏漏欢迎指正. 1.JDK版本 以下所有优化全部基于JDK8版本,强烈建议低版本升级到JDK8,并尽可能使用update_191以后版本. 2.如何选择垃圾回 ...

  4. 【Jenkins】 GitLab Gitee GitHub 部署

    Jenkins GitLab Gitee GitHub 部署 环境 Jenkins Git Maven Jenkins 部署可参考文章:https://www.cnblogs.com/cxt618/p ...

  5. PTA 21级数据结构与算法实验6—图论

    目录 7-1 邻接矩阵表示法创建无向图 7-2 邻接表创建无向图 7-3 图深度优先遍历 7-4 单源最短路径 7-5 列出连通集 7-6 哈利·波特的考试 7-7 家庭房产 7-8 森森美图 7-9 ...

  6. 每日一题:SpringBoot中支持的事务类型

    以下是每种事务类型的作用.代码示例和对代码的解释: PROPAGATION_REQUIRED(默认): 作用:如果当前存在事务,则方法将在该事务中运行:如果不存在事务,则创建一个新的事务.适用于大多数 ...

  7. SSH远程主机执行命令:s2c

    #!/bin/bash ip=$1 ip_num=$(echo $ip | awk -F\. '{print NF}') if [ $ip_num -eq 2 ]; then ip=192.168.$ ...

  8. os模块常用操作

    作者:Simon0903 链接:https://www.jianshu.com/u/2b4bc3b5e6fc 來源:简书 os.getcwd() #返回当前工作目录 os.chdir(path) #改 ...

  9. TypeChat源码分析:基于大语言模型的定制化 AI Agent 交互规范

    TypeChat源码分析:基于大语言模型的定制化 AI Agent 交互规范 本文深入介绍了微软最近发布的 TypeChat 项目,该项目允许开发者定义大语言模型返回的响应结构.通过分析源代码,探讨了 ...

  10. 快速掌握Vue3:速成Vue3前端开发看这篇就够啦

    一.Vue基本概念 1.1-Vue3的优点 Vue3支持Vue2额大多数特性. 更好的支持TypeScript. 打包大小减少41%. 初次渲染快55%,更新渲染快133%. 内存减少54%. 使用p ...