桶排序
桶排序(Bucket sort)或所谓的箱排序,也是一种排序算法。
其工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是比较排序,他不受到O(n log n)下限的影响。
算法步骤
- 设置一个定量的数组当作空桶子;
- 寻访序列,并且把项目一个一个放到对应的桶子去;
- 对每个不是空的桶子进行排序;
- 从不是空的桶子里把项目再放回原来的序列中。
计数排序
计数排序(Counting sort)是一种稳定的线性时间排序算法。
计数排序使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。然后根据数组C来将A中的元素排到正确的位置。
算法步骤
- 找出待排序的数组中最大和最小的元素;
- 统计数组中每个值为i的元素出现的次数,存入数组 C 的第 i 项;
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
代码实现
/**
* Created by lysongzi on 16/3/2.
* 计数排序
*/
public class CountSort {
public static void sort(int[] arr){
int i = 0;
int[] result = new int[arr.length];
int max = arr[0];
int min = arr[0];
for (int num : arr){
if (num > max)
max = i;
if (num < min)
min = i;
}
int len = max - min + 1;
//生成计数数组
int[] count = new int[len];
//开始计数
for (i = 0; i < arr.length; i++)
count[arr[i] - min]++;
for (i = 1; i < count.length; i++)
count[i] += count[i - 1];
//将排序结果存入result数组中
for (i = arr.length - 1; i >= 0; --i)
result[--count[arr[i] - min]] = arr[i];
//将结果拷贝到arr
for (i = 0; i < result.length; i++)
arr[i] = result[i];
}
}
参考资料
- 维基百科