计数排序
通识:计数排序说白了是一种以空间换时间的做法,在小规模排序中它的性能会比快排,归并要快一些,但是进行大规模排序是就可能出现性能过低的现象。其中有一个阈值O(k)>O(nlog(n)),其中O(nlog(n))是需要比较的排序这些算法的下限。
缺点:空间浪费可能较大,无法估量比如你相对数组number[2]={100000,1}进行排序,那么你就得创建一个数组长度为100001的数组来进行存储,比如我们称这个数组为store,那么我们就需要将number数组中的1存到store数组的1号位置store[1],同理,number中的100000存到store[100000]中。但是这100001长度的数组我们只用了两个位置,从而造成了空间上的浪费。
下面展示一些 内联代码片
。
Java代码展示
public class countsort {
public static void count_sort(int a[]){
int []number=new int[100];//首先开辟足够大的空间来存储数值,这也是计数方法的缺陷点,因为我们不知道数组中存的数值最大值是多少,
// 如果数值够大那么将会损失很大的空间,比如数组a[2]={1,100000},其中数组长度为二,但是我们就需要创建一个长度为100001的数组来进行存储,这大大浪费了我们的空间
//从而可以说是以空间换时间
//java中你创建数组如果不初始化,那么系统会默认其值为0
for (int i=0;i<a.length;i++)
{
number[a[i]]++;//当前要排序的数值放到新开辟数组的中(数字数值=新开辟数组下标号),之后让当前下标存储的数值+1,表示这个数已经出现一次
}
for (int i=0;i<number.length;i++)//进行输出
{
if(number[i]!=0)
{
for(int j=0;j<number[i];j++)
{
System.out.print(i+" ");
}
}
}
}
public static void main(String [] args){
int []numbers={15,14,19,0,1,20,17,85,3,3};
count_sort(numbers);
}
}