桶排序算法的原理
一、桶排序算法的原理
桶排序的思想是先进行分区,然后将数组中的数按照对应的区间放,
下面展示一些 基数排序代码片
。
//基数排序法
package arraylist;
import java.util.Arrays;
public class CardinalSort {
public static void main(String[] args) {
int [] arr= {478,535,678,156};
sort(arr);
}
static void sort(int[] arr) {
int max = arr[0];
for(int i = 1; i < arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
}
//定义一个二维数组,表示有10个桶,即数值0-9的10个桶
//为了防止在放入数的时候出现数据溢出,则设置每一个桶的大小为需要排列数组的长度,即arr.length
int[][] bucket = new int[10][arr.length];
//定义一个一维数组,记录每个桶的每次放入的数据个数
//比如bucketOfElementCounts[0],记录的就是bucket[0]桶中放入数据的个数
int[] bucketOfElementCounts = new int[10];
int maxLength = (max + "").length();
for(int i = 0, n = 1; i < maxLength; i++, n *= 10){
//针对每个元素的对应位进行排序处理,第一次是个位,第二次是十位,第三次是百位。。。
for(int j = 0; j < arr.length; j++){
//取出每一个元素的对应位的值
int count = arr[j] / n % 10;
//放入到对应的桶中
bucket[count][bucketOfElementCounts[count]] = arr[j];
bucketOfElementCounts[count]++;
}
//遍历一遍桶中的数据,按照这个桶的顺序,依次取出数据,放入原来的数组
int index = 0;
for(int k = 0; k < bucketOfElementCounts.length; k++){
//如果桶中有数据,才将该桶的数据放入原数组
if(bucketOfElementCounts[k] != 0){
//循环该桶,将该桶中的数据依次放入到原数组中
for(int l = 0; l < bucketOfElementCounts[k]; l++){
//取出元素放入到arr
arr[index++] = bucket[k][l];
}
}
//在第i+1轮处理后,需要将每个bucketOfElementCounts[k] = 0,这一步很关键。
bucketOfElementCounts[k] = 0;
}
System.out.println("第"+(i+1)+"轮,对各位的排序处理,arr="+ Arrays.toString(arr));
}
}
}
基数排序的时间复杂度为O(n*k),空间复杂度为O(n),算法是稳定的。