计数排序利用的是数组的随机访问特性,将要排序的数k转换成数组的下标K,该数组中以k为下标的值A[k]代表这个数K的个数。这种排序非常快,但应用条件比较苛刻。
主要受需要排序的序列规模(n),序列最大值(max(n))影响,如果max(n)过大,算法空间复杂度比较高,也是该算法的一个制约因素。下面是两种方式实现:
1) 第一种方式速度比第2种快,但没有稳定性,而且不能用于基数计数排序。
private void CountSort(int[] A)
{
List<int> theC = new List<int>();
int theLen = A.Length;
int theMaxVal = 0;
for (int i = 0; i < theLen; i++)
{
if (A[i] > theMaxVal)
{
theMaxVal = A[i];
AddLength(theC, theMaxVal);
}
theC[A[i]-1]++;
theCount++;
}
int j = 0;
for (int i = 0; i < theMaxVal; i++)
{
for (int k = 0; k < theC[i] - 1; k++)
{
A[j] = i + 1;
j++;
}
}
}
2)教科书里的算法,优点是具有稳定性,可用于基数计数排序。速度比前一种要慢些。时间约为2(n+k)
private int[] CountSort2(int[] A)
{
//用列表主要是可以动态增加长度.
List<int> theC = new List<int>();
int theLen = A.Length;
int[] theB = new int[theLen];
int theMaxVal = 0;
for (int i = 0; i < theLen; i++)
{
if (A[i] > theMaxVal)
{
theMaxVal = A[i];
AddLength(theC, theMaxVal);
}
theC[A[i]-1]++;
theCount++;
}
for (int i = 1; i < theMaxVal; i++)
{
theC[i] += theC[i - 1];
theCount++;
}
for (int i = theLen-1; i>=0; i--)
{
theB[theC[A[i] - 1]-1] = A[i];
(theC[A[i]-1])--;
theCount++;
}
return theB;
}
private void AddLength(List<int> C, int MaxLen)
{
int iLen = MaxLen - C.Count;
for (int i = 0; i < iLen; i++)
{
C.Add(0);
theCount++;
}
}
后记:计数算法适合序列元素比较集中,差值不大的情况。如果知道一个序列的最大值和最小值,而且最大值与最小值相差不是很大的情况,比较适合用这种排序。
字母排序,简单数字符号(0-9)排序等。
分享到:
相关推荐
Java实现计数排序不是C,Java实现计数排序不是C,Java实现计数排序不是C
计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数...
计数排序 用C++实现 简单易懂 欢迎下载
计数排序的代码实现,对应分析在我的博客里找,学习和开发的随便下
以前看过网上的一篇关于一种号称时间复杂度能达到O(n)的不用比较就可以实现排序的算法——计数排序法,这是自己用C写的一个实现,大家可以参考下,欢迎指证。
主要是对算法导论中计数排序的实现
计数排序是一种非比较型整数排序算法,特别适用于一定范围内的非负整数排序。该算法通过统计每个元素出现的次数来确定元素在排序后数组中的位置,从而达到排序的目的。计数排序的时间复杂度为O(n+k),其中n为待排序...
计数排序是一种非比较型整数排序算法,特别适用于一定范围内的非负整数排序。该算法通过统计每个元素出现的次数来确定元素在排序后数组中的位置,从而达到排序的目的。计数排序的时间复杂度为O(n+k),其中n为待排序...
计数排序是一种适用于非负整数且范围不大...在Python3中,我们可以通过开辟额外的计数数组来实现计数排序算法。尽管计数排序在某些情况下可能不是最优选择,但它在处理特定类型的数据时仍然是一种非常有效的排序方法。
countingSort 方法实现了计数排序算法。首先,我们遍历一遍原数组,找出其中的最大值,以确定计数数组的大小。然后,创建计数数组 count,并将每个元素的出现次数记录在计数数组中。接下来,根据计数数组中的元素...
计数排序不是比较排序,排序的速度快于任何比较排序算法。 由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量...
Python实现计数排序.rar
这些代码是对算法导论上对排序部分的总结,实现了以下排序方法:插入排序,合并排序,堆排序,快速排序,计数排序,每种实现都有详细的注释和相应的测试程序,可查找http://blog.csdn.net/china8848<br>中对相关问题...
利用python实现计数排序,程序直接可以用
该资源提供了在Java中如何实现计数排序的全面指南。文档涵盖了计数排序的基本概念,包括如何对数组进行排序以及如何在Java中实现计数排序。此外,文档还包括一个逐步指南,介绍了如何在Java中实现计数排序,包括详细...
各种排序算法的实现函数:包括冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。 查找最大最小值函数 findMinMax:在给定数组中查找最大值和最小值。 计算平均值...
基于python的计数排序算法设计与实现
介绍计数排序的概念、特点、优缺点、适用场景和java代码简单实现。
本文实例讲述了JS实现的计数排序与基数排序算法。分享给大家供大家参考,具体如下: 计数排序 计数排序就是简单的桶排序,一个桶代表数组中一个数出现的个数,所以需要一个和数组数字范围一样大的辅助数组,一般用在...
python实现计数排序、快速排序算法; 基于排序算法实现秩和检验,用于检验两个序列的差异性