🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
排序算法是一种将一组数据按照特定的规则进行排列的方法。排序算法通常用于对数据的处理,使得数据能够更容易地被查找、比较和分析。
下面是常见的11种排序算法:
计数排序是一种非比较排序算法,它的基本思想是:对于一组待排序的元素,如果知道了每个元素的大小关系,那么就可以利用这个信息对它们进行排序。具体实现时,先统计出待排序元素中每个元素出现的次数,然后根据元素的大小关系,依次把元素放回原来的位置中,最终得到一个有序的序列。
计数排序的基本步骤如下:
计数排序的时间复杂度为O(n+k),其中n是待排序数组的长度,k是计数数组的大小。当k较小时,计数排序的效率很高,但当k较大时,计数排序的辅助空间会非常大。因此,计数排序适合对于取值范围较小的整数进行排序。
计数排序的时间复杂度为O(n+k),其中n是待排序数列的长度,k是数列中元素的最大值与最小值的差值加上1。空间复杂度也为O(n+k),因为需要借助辅助数组来存储排序结果。
计数排序的核心思想是对每个数进行计数并统计其出现的次数,然后按顺序输出即可。由于不需要比较元素,计数排序的时间复杂度与待排序数列的数据范围有关,而与具体数列中元素的个数无关。
计数排序的优点是速度快,适用于元素数目比较小的情况,但对于数据范围比较大的数列,需要的辅助空间也会很大,而且无法应用于包含负数的数列。
计数排序适用于数据范围比较小的情况下,例如对于一组正整数的排序。因为计数排序是利用桶的思想实现的,需要开辟一个长度为数据的范围的桶,所以对于数据范围比较大的情况下,计数排序的空间复杂度会非常高,不适合使用。
以下是计数排序的常见应用场景:
计数排序主要是用于整数排序,通常能够在O(n)的时间复杂度下实现排序。因此,如果你需要对一组整数进行非常快速地排序,计数排序是一个不错的选择。
/// <summary>
/// 计数排序
/// </summary>
public class Program {
public static void Main(string[] args) {
int[] array = { 43, 69, 11, 72, 28, 21, 56, 80, 48, 94, 32, 8 };
CountingSort(array);
ShowSord(array);
Console.ReadKey();
}
private static void ShowSord(int[] array) {
foreach (var num in array) {
Console.Write($"{num} ");
}
Console.WriteLine();
}
public static void CountingSort(int[] array) {
if (array.Length == 0) return;
int min = array[0];
int max = min;
foreach (int number in array) {
if (number > max) {
max = number;
}
else if (number < min) {
min = number;
}
}
int[] counting = new int[max - min + 1];
for (int i = 0; i < array.Length; i++) {
counting[array[i] - min] += 1;
}
int index = -1;
for (int i = 0; i < counting.Length; i++) {
for (int j = 0; j < counting[i]; j++) {
index++;
array[index] = i + min;
}
}
}
}