排序之基数排序

发布时间:2024年01月14日

基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序算法的主要优点是在处理大量数据时,其时间复杂度为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),因此它非常适合处理大量数据。此外,基数排序是稳定的排序算法,即相等的元素的相对顺序不会改变。

缺点:基数排序需要额外的存储空间来存储桶,这可能会导致空间复杂度增加。此外,基数排序只适用于非负整数。

文章来源:https://blog.csdn.net/weixin_62988359/article/details/135570993
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。