基数排序
将整数按照位数切割成不同的数字,按每个位数分别比较。
基数排序是稳定的(大小相同的两个数,排序完成之后靠前的那一个仍然在前面)
思想:基数排序是依靠空间来交换时间的一种排序,一般我们会设置数据桶为一个二维数组。
-
找到数组中最大的数并查看它的位数
-
按照个位,十位,百位这样for循环,分别进行排序
-
将序列中每个元素取出,放入对应的桶中
-
遍历每个桶,将桶中的数据放入到原数组。统计完成后,要将桶清空。
-
代码实现:
package com.sortAlgorithm;
import java.util.Arrays;
public class radixSorting {
public static void main(String[] args) {
int[] arr = {53,3,542,748,14,214};
int max = arr[0];
for(int i = 1;i<arr.length;i++){
if(arr[i]>arr[0]){
max = arr[i];
}
}
//查看max的位数
int maxlength = (max+"").length();
radixSorting radixSorting = new radixSorting();
radixSorting.radix(arr,maxlength);
System.out.println(Arrays.toString(arr));
}
public void radix(int[] arr,int maxlength){
int[][] bucket = new int[10][arr.length];
int[] bucketIndex = new int[10]; //表示第几个桶中包含了几个数字
//找到数组中最大的数并查看它的位数
for(int i = 0,n = 1;i<maxlength;i++,n *= 10){
for(int j = 0;j<arr.length;j++){
int need = (arr[j]/n)%10;
bucket[need][bucketIndex[need]] = arr[j];
bucketIndex[need]++;
}
//遍历每个桶,将数据放入原数组
int temp = 0;
for(int q = 0; q<10;q++){
if(bucketIndex[q] != 0){
for(int w = 0;w<bucketIndex[q];w++){
arr[temp] = bucket[q][w];
temp++;
}
}
}
//清空bucketIndex
for (int o = 0; o<10;o++){
bucketIndex[o] = 0;
}
}
}
}