计数排序(Counting Sort)是一种非比较型整数排序算法,其核心在于将输入的数字映射到数组索引上。与传统排序算法相比,计数排序在处理特定类型的数据时(如整数或小范围的值)具有非常高的效率。该算法的时间复杂度通常为O(n + k),其中n是待排序数组中的元素数量,k是数组中最大和最小元素的差值。
计数排序的基本思想是:对于给定的一组数据,我们首先统计每个值出现的次数,然后根据这些计数来确定每个元素在排序后数组中的位置。算法的步骤如下:
下面是一个计数排序算法的C#实现示例:
using System;
class Program
{
static void CountingSort(int[] arr)
{
int max = arr[0];
int min = arr[0];
// 找出最大值和最小值
for (int i = 1; i < arr.Length; i++)
{
if (arr[i] > max)
max = arr[i];
if (arr[i] < min)
min = arr[i];
}
int range = max - min + 1;
int[] count = new int[range];
int[] output = new int[arr.Length];
// 初始化计数数组
for (int i = 0; i < arr.Length; i++)
{
count[arr[i] - min]++;
}
// 累加计数数组
for (int i = 1; i < count.Length; i++)
{
count[i] += count[i - 1];
}
// 构建排序数组
for (int i = arr.Length - 1; i >= 0; i--)
{
output[count[arr[i] - min] - 1] = arr[i];
count[arr[i] - min]--;
}
// 将排序后的数组复制回原数组
for (int i = 0; i < arr.Length; i++)
{
arr[i] = output[i];
}
}
static void Main()
{
int[] arr = { 4, 2, 2, 8, 3, 3, 1 };
int n = arr.Length;
Console.WriteLine("Given array is ");
foreach (int value in arr)
{
Console.Write(value + " ");
}
CountingSort(arr);
Console.WriteLine("\nSorted array is ");
foreach (int value in arr)
{
Console.Write(value + " ");
}
}
}
在这个示例中,我们首先定义了一个未排序的整数数组arr
。然后,我们使用CountingSort
方法对数组进行排序。CountingSort
方法首先找出数组中的最大值和最小值,然后创建并初始化计数数组,接着填充计数数组并累加计数,最后根据累加后的计数数组构建排序后的数组。
计数排序的时间复杂度通常为O(n + k),其中n是待排序数组中的元素数量,k是数组中最大和最小元素的差值。由于计数排序不是基于比较的排序算法,因此它在处理特定类型的数据时(如整数或小范围的值)具有非常高的效率。
计数排序的空间复杂度是O(k),因为我们需要额外的存储空间来存储计数数组。
尽管计数排序在特定情况下非常高效,但在某些情况下,其性能可能会受到影响。例如,当k的值非常大时,计数排序的空间复杂度会很高。为了优化计数排序,可以采取以下措施:
下面是一个优化后的计数排序算法的C#实现示例,使用线性计数数组:
using System;
class Program
{
static void CountingSort(int[] arr, int max)
{
int[] count = new int[max + 1];
int[] output = new int[arr.Length];
// 初始化计数数组
for (int i = 0; i < arr.Length; i++)
{
count[arr[i]]++;
}
// 累加计数数组
for (int i = 1; i < count.Length; i++)
{
count[i] += count[i - 1];
}
// 构建排序数组
for (int i = arr.Length - 1; i >= 0; i--)
{
output[count[arr[i]] - 1] = arr[i];
count[arr[i]]--;
}
// 将排序后的数组复制回原数组
for (int i = 0; i < arr.Length; i++)
{
arr[i] = output[i];
}
}
static void Main()
{
int[] arr = { 4, 2, 2, 8, 3, 3, 1 };
int max = 8; // 假设我们知道最大值
Console.WriteLine("Given array is ");
foreach (int value in arr)
{
Console.Write(value + " ");
}
CountingSort(arr, max);
Console.WriteLine("\nSorted array is ");
foreach (int value in arr)
{
Console.Write(value + " ");
}
}
}
在这个优化后的示例中,我们使用线性计数数组来减少空间复杂度。
计数排序适用于以下场景:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。