Java排序算法基数排序(桶排序)

概述

Java中排序算法是非常重要的一部分,这里简单分析下基数排序(桶排序)的实现思路及其代码实现。

常见排序算法时间复杂度表

排序算法 平均时间复杂度 最差情形 稳定度 额外空间 备注
冒泡排序 O(n^2) O(n^2) 稳定 O(1) n小时较好
插入排序 O(n^2) O(n^2) 稳定 O(1) n小时较好
选择排序 O(n^2) O(n^2) 不稳定 O(1) n小时较好
快速排序 O(nlogn) O(n^2) 不稳定 O(nlogn) n大时较好
希尔排序 O(nlogn) O(n^s)1 < s < 2 不稳定 O(1) n大时较好
归并排序 O(nlogn) O(nlogn) 稳定 O(1) n大时较好
堆排序 O(nlogn) O(nlogn) 稳定 O(1) n大时较好
基数排序 O(nlogn) OlogrB O(n) O(n) B为真数(0-9),r为基数个十百

基数排序(桶排序)介绍

基数排序(radix sort)属于分配式排序,又称为桶排序。顾名思义,它是通过键值的各个位数的值将要排序的元素分配至某些桶中,达到排序的作用。
基数排序属于稳定性的排序,基数排序是一个效率高的稳定性排序法
基数排序是(Radix sort)是桶排序的扩展

基数排序的基本思想

  1. 将所有待比较数值统一为同样位数长度,位数较短的数前面补零。然后从最低位开始,依次进行排序。一直从最低位排到最高位后,数列便成为了一个有序的数列了。

基数排序图解

基数排序图解

基数排序代码实现(本代码仅支持正整数)

public class RadixSort {

	/**
	* @param arr 待寻找的数组
	* @return 数组中最大位数的长度
	*/
	public static int findMax(int[] arr) {
		if (arr == null || arr.length <= 0) {
			throw new IllegalArgumentException();
		}
		int max = arr[0];
		for (int i = 1;i < arr.length;i++) {
			if (max < arr[i]) {
				max = arr[i];
			}
		}
		int maxLength = ("" + max).length;
		return maxLength;
	}

	/**
	* 进行桶排序
	* @param arr 待排序的数组
	* @param 数组中最大数的位数
	*/
	public static void radixSort(int[] arr, int maxLength) {
		if (arr == null || arr.length <= 0) {
			throw new IllegalArgumentException();
		}
		// 创建10个桶,分别记录数值为(0 - 9)
		int[][] bucket = new int[10][arr.length];
		
		// 创建10个数组用来记录每个桶中元素的个数
		int[] bucketElementCounts = new int[10];
		for (int i = 0,n = 1;i < maxLength;i++,n *= 10) {
			for (int j = 0;j < arr.length;i++) {
				int digitOfElement= arr[i] / n % 10;
				bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
				bucketElementCounts[digitOfElement] ++;
			}
			
			int index = 0;
			for (int i = 0;i < bucketElementCounts.length;i++) {
				if (bucketElementCounts[i] > 0) {
					for (int j = 0; j < bucketElementCounts[i];j++) {
						arr[index] = bucket[i][j];
						index++;
					}
					bucketElementCounts[i] = 0;
				}
			}
		}
	}
}

代码写完,小弟能力有限,仅供参考!!!如有错误欢迎指出。

发布了10 篇原创文章 · 获赞 12 · 访问量 2196

猜你喜欢

转载自blog.csdn.net/justLym/article/details/104615573