计数排序和桶排序
计数排序
假设数组中有20个随机整数,取值范围是0~10,要求对其进行从小到大排序
解:
1.新建一个长度为11的数组,初始化为0
2.假设20个随机整数的值如下:
9,3,5,4,9,1,2,7,8,1,3,6,5,3,4,0,10,9,7,9
3.遍历整个随机数列,如整数9,则下标为9的元素加1
4.第二个整数3,则下标为3的元素加1
5.遍历结束之后的数组,即完成排序:
代码如下:
public static int[] contSort(int[] arr)
{
//获取数列的最大值
int max = arr[0];
for(int i = 1;i < arr.length;i ++)
{
if(arr[i] > max)
{
max = arr[i];
}
}
//创建长度为最大值的新数组
int[] countArr = new int[max + 1];
//遍历数列,填充数组
for(int i = 0;i < arr.length;i ++)
{
countArr[arr[i]] ++;
}
//遍历数组,输出结果
int index = 0;
int[] sortArr = new int[arr.length];
for(int i = 0;i < countArr.length;i ++)
{
for(int j = 0;j < countArr[i];j ++)
{
sortArr[index ++] = i;
}
}
return sortArr;
}
局限性:
数列各个数组差距过大时,不适合用计数排序
数列元素不是整数时,不适合用计数排序
桶排序
每一个桶(bucket)代表一个区间范围,里面可以承载至少一个元素
1.创建这些桶,并确定每个桶的范围
桶的数量可以是原始数列的元素个数,区间跨度可以按照以下算法:
区间跨度 = (最大值 - 最小值) / (桶的数量 - 1)
2.遍历原始序列,放入桶中
3.对每个桶分别进行排序
4.遍历所有的桶,输出排好序的元素
局限性:
元素分布极不均匀时,不适合使用桶排序