基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序算法的主要优点是在处理大量数据时,其时间复杂度为O(nlogn),空间复杂度为O(1)。
代码实现
下面是基数排序的Java实现:
import java.util.Arrays;
//基数排序
public class RadixSort {public static void main(String[] args) {int[] arr = {57,71,41,208,10,39,1,6,15,106,109,107,20,30,50};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr) {//定义桶int [][] bucket = new int[10][arr.length];//定义桶记录int[] elementCounts = new int[10];//获取最大值的位数int max = arr[0];for(int m = 0;m<arr.length;m++) {if(arr[m]>max) {max = arr[m];}}int maxLength = (max+"").length();int n = 1;for(int h=0;h<maxLength;h++) {//数据放入for(int i=0;i<arr.length;i++) {int element = arr[i]/n%10;//element代表个位数值,也代表要放入哪号桶int count = elementCounts[element];//读取桶记录当中的数据bucket[element][count] = arr[i];//数据存入elementCounts[element]++;//桶记录+1}//数据取出int index = 0;//定义游标遍历数组,取出的数据要存放的下标//遍历桶记录for(int k = 0;k<elementCounts.length;k++) {if(elementCounts[k]!=0) {//定义游标遍历对应的桶里边的数据for(int l=0;l<elementCounts[k];l++) {arr[index] = bucket[k][l];index++;}}//清除桶记录elementCounts[k] = 0;}n = n*10;//System.out.println(Arrays.deepToString(bucket));}}}
工作原理
基数排序的基本思想是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。每次比较,都是将对应的数放入到对应的桶中,然后再从桶中取出。
首先,我们需要找到数组中的最大值,以确定最大位数。然后,我们按照每一位进行排序。对于每一位,我们都创建一个新的桶,并将元素放入相应的桶中。然后,我们从每个桶中取出元素,放回到原数组中。最后,我们继续处理下一位。
优点和缺点
优点:基数排序的时间复杂度为O(nlogn),空间复杂度为O(1),因此它非常适合处理大量数据。此外,基数排序是稳定的排序算法,即相等的元素的相对顺序不会改变。
缺点:基数排序需要额外的存储空间来存储桶,这可能会导致空间复杂度增加。此外,基数排序只适用于非负整数。