您的位置:首页 > 其它

计数排序(CountingSort)的实现

2009-11-10 00:43 465 查看
CountingSort是一种典型的以空间换时间的排序算法~ 因此它的复杂度可以达到线性关系,而且计数排序是一种稳定的排序算法~但是不足之处是它只能用于整数的排序~

主要的思想可以通过下面的伪代来了解:

for i←1 to k

doC[i] ←0

for j←1 to n

doC[A[j]] ←C[A[j]] + 1 ⊳C[i] = |{key = i}|

for i←2 to k

doC[i] ←C[i] + C[i–1] ⊳C[i] = |{key ≤i}|

for j←n down to1

doB[C[A[j]]] ←A[j]

C[A[j]] ←C[A[j]] –1

其实算法实现并不难,主要把数组下标注意到就可以了~

下面是它的java实现代码:

//只用于整数排序;

public class CountingSort{

public void CountingSort(int []L)

{

int n=L.length; //L数组的大小;

//获得数组L中的最大的数;

int k=0; //C数组的大小;

for(int i=0;i<n;i++)

{

if(k<L[i])

k=L[i];

}

int C[]=new int[k];

for(int i=0;i<k;i++)

C[i]=0;

for(int i=0;i<n;i++)

C[L[i]-1]=C[L[i]-1]+1;

for(int i=1;i<k;i++)

C[i]=C[i]+C[i-1];

int B[]=new int
;

for(int i=n-1;i>=0;i--)

{

B[C[L[i]-1]-1]=L[i];

C[L[i]-1]=C[L[i]-1]-1;

}

for(int i=0;i<n;i++)

L[i]=B[i];

}

public static void main(String []args){

int A[]={10,2,3,2,5,7,5,3,4};

CountingSort Test=new CountingSort();

Test.CountingSort(A);

for(int i=0;i<A.length;i++)

System.out.println(A[i]);

}

}

Output:

--------------------Configuration: <Default>--------------------

2

2

3

3

4

5

5

7

10

Process completed.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: