1、简单介绍
1.计数排序的特点,计数排序最大的特点是稳定,并且排序的元素,之间的值差别不大。
2、计数排序是一个稳定的排序,我们需要了解既然它只能够对整数进行排序,为什么还要保证其稳定性。
3、既然如果保证稳定性,并且不只是对整数进行排序,它还能够对什么类型进行排序?
4、计数排序的时间复杂度和空间复杂度,时间复杂度都是O(n+k) n表示的是元素的个数 k 表示数据之间的范围。
5、空间复杂度是O(k+n)
2、代码实现
/**
* 计数排序的实现
*
* @param a
*/
public static void countSort(int[] a) {
int max = getMax(a);
int min = getMin(a);
int k=max-min+1;
int b[]=new int[k]; //定义一个数组用于存储小于等于它的元素个数。
for(int i=0;i<a.length;i++){ //统计每个元素出现的次数
b[a[i]-min]++;
}
for(int j=1;j<b.length;j++){ //统计小于等于它的元素出现的次数
b[j]=b[j-1]+b[j];
}
int c[]=new int[a.length];
for(int i=a.length-1;i>=0;i--){ //从后面进行比较是保证稳定性。
c[b[a[i]-min]-1]=a[i]; //b[a[i]-min] 表示的是该元素总共有多少个元素下于等于它。
b[a[i]-min]--; //进行计数--;
}
}
/**
* 获取最大值
* @param a
* @return
*/
private static int getMin(int[] a) {
int min=a[0];
for (int i = 1; i < a.length; i++) {
if(a[i]<min) min=a[i];
}
return min;
}
/**
* 获取最小值
* @param a
* @return
*/
private static int getMax(int[] a) {
int max=a[0];
for (int i = 1; i < a.length; i++) {
if(a[i]>max) max=a[i];
}
return max;
}
3、总结
1、计数 排序,原理上只能够对整数进行排序,但是我们可以把整数作为一个对象的属性,然后进行排序,我们就可以保证其稳定性。
2、因此,我们写代码的时候,我们考虑到其稳定性,所以写的代码比普通,只是记录值,出现的个数,要复杂。
所以现在能够存在,主要是因为它能够保证其稳定性。