今天在论坛上看到一个关于计数排序的问题,刚好自己这几天在复习排序,所以就把自己的理解写下来。
定义:
计数排序:是一种非比较排序算法,因此其时间复杂度比O(nlgn)还要低,是O(n).
但是使用计数排序是有条件的:n个输入元素中每个都是介于1到k之间的整数,k是整数。
思想:
对每个输入元素x,确定出小于x的元素数,然后在直接把x放到它的最终位置上。
伪代码:
A:输入数组
B:输出数组
k:数组A中的最大数
Counting-Sort(A, B, k)
For i从1到k
C[i] = 0
//统计A中的每个元素出现的次数
For j从1到length[A]
C[A[i]] = C[A[i]] +1
//对A中的每个元素,求小于等于它的元素的个数
For i从2到k
C[I]=C[i]+C[i-1]
//把A中的每个元素放在B中适当的位置上
For j从length[A] 到1
B[C[A[j]]] = A[j]
C[A[j]]=C[A[j]]-1
需要说明以下的是:在该伪代码中,计数排序是稳定的,这是由第4个循环中j从大到小的顺序决定的。
具体程序:
#include <iostream>
using namespace std;
int main()
{
int A[10] = {5,6,4,9,2,2,1,7,10,8};
int B[10];
int C[11];
int i=0;
for(i=0; i<10; i++)
{
cout<<A[i]<<" ";
}
cout<<endl;
for(i=0; i<11;i++)
C[i]=0;
for(i=0; i<10; i++)
{
C[A[i]]=C[A[i]] + 1;
}
int j=1;
while(j<=10)
{
C[j] = C[j] + C[j-1];
j ++;
}
i=10;
while(i>=0)
{
B[C[A[i-1]]-1] = A[i-1];
C[A[i-1]]--;
i--;
}
for(i=0; i<10; i++)
{
cout<<B[i]<<" ";
}
cout<<endl;
return 0;
}
本文介绍了计数排序这一非比较型排序算法,详细解释了其工作原理,并通过一个C++实现的例子展示了如何对特定范围内的整数进行排序。计数排序的时间复杂度为O(n),适用于输入元素范围固定的情况。
765

被折叠的 条评论
为什么被折叠?



