计数排序此处的实现时间复杂度为O(n+k),空间复杂度为O(k),不稳定。--要实现空间复杂度为O(k),则会牺牲掉稳定性。要实现稳定性,则空间复杂度为O( n+k)。
因为本次要排序的元素都是int类型,不需要实现稳定性。而有些时候,排序的元素不属于基本类型,用于排序的键实际上只是这个元素中的一个属性(键值相同,而元素可能不同),如果不实现稳定性,则会破坏键值相等的两个元素的相对位置。
/*************************
Name:VincentZeng
e-mail:632373328@qq.com
Function implemeted:CountingSort
*****************************/
public class TestCountingSort
{
public static void main( String args[] )
{
int a[] = {1,5,3,6,2,4,2};
System.out.println("Array:");
for( int n : a)
System.out.print(n + " ");
System.out.println();
CountingSort.countingSort(a);
System.out.println("Sorted:");
for( int n : a)
System.out.print(n + " ");
System.out.println();
}
}
class CountingSort
{
public static void countingSort(int a[])
{
int max = a[0],min = a[0];
for( int n : a)
{
if(n > max)
max = n;
if(n < min)
min = n;
}
int k = max - min + 1;
int counter[] = new int[k]; //创建一个下标对应目标数组的值,值对应 下标所对应的目标数组的值 的出现次数。
for(int n : a) //计算 counter 数组的值
counter[ n - min ]++;
//填充目标数组为有序数组。
int j = 0;
for(int i = 0;i < a.length;i++) //只用了counter,空间复杂度为O(k)
{
for(int m = 0;m < counter.length;)
{
if(counter[m] != 0)
{
a[j++] = m + min;
counter[m]--;
}
if(counter[m] == 0)
m++;
}
}
}
}