Day567.基数排序 -数据结构和算法Java
Posted 阿昌喜欢吃黄桃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day567.基数排序 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。
基数排序
一、介绍
二、基本思想
三、思路分析
四、代码实现
package com.achang.sort;
import java.util.Arrays;
/**
* @Author Achang
* @Date 2022/3/24 21:29
* 基数排序
**/
public class RadixSort
public static void main(String[] args)
int arr[] = 53,3,542,748,14,214;
radixSort1(arr);
System.out.println(Arrays.toString(arr));
//基数排序最终代码
public static void radixSort1(int[] arr)
//得到数组中最大数的位数
int max = arr[0];
for (int i = 1; i < arr.length; i++)
if (arr[i] > max)
max = arr[i];
int maxLength = String.valueOf(max).length();
//定义二维数组,表示10个桶,每个桶表示一个一维数组
int[][] bucket = new int[10][arr.length];
//为了记录每个桶实际存放多少个数据,于是定义一个一维数组来记录各个桶每次放入数据的个数
//例子:bucketElementCounts[0] ,表示bucket[0]桶每次放入数据的个数
int[] bucketElementCounts = new int[10];
for (int c = 0,n = 1; c < maxLength; c++,n *= 10)
for (int j = 0;j < arr.length;j++)
//取出元素的个位值
int digitOfElement = (arr[j] / n) % 10;
//放入到对应的桶中
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
bucketElementCounts[digitOfElement]++;
//按照这个桶的顺序(一维数组的下标依次取出数据,放到原来的数组)
int index1 = 0;
//遍历每一个桶
for (int i = 0; i < bucket.length; i++)
//如果桶中有数据,才取出
if (bucketElementCounts[i] != 0)
//循环该桶
for (int l = 0;l< bucketElementCounts[i]; l++)
//取出元素,放入到arr中
arr[index1++] = bucket[i][l];
//第一轮处理后,需要bucketElementCounts[i] = 0
bucketElementCounts[i] = 0;
//基数排序推导
public static void radixSort2(int[] arr)
//第一轮排序,针对每个元素的各位进行排序
//定义二维数组,表示10个桶,每个桶表示一个一维数组
int[][] bucket = new int[10][arr.length];
//为了记录每个桶实际存放多少个数据,于是定义一个一维数组来记录各个桶每次放入数据的个数
//例子:bucketElementCounts[0] ,表示bucket[0]桶每次放入数据的个数
int[] bucketElementCounts = new int[10];
//第一轮,针对每个元素的个位进行排序处理
for (int j = 0;j < arr.length;j++)
//取出元素的个位值
int digitOfElement = arr[j] / 1 % 10;
//放入到对应的桶中
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
bucketElementCounts[digitOfElement]++;
//按照这个桶的顺序(一维数组的下标依次取出数据,放到原来的数组)
int index1 = 0;
//遍历每一个桶
for (int i = 0; i < bucket.length; i++)
//如果桶中有数据,才取出
if (bucketElementCounts[i] != 0)
//循环该桶
for (int l = 0;l< bucketElementCounts[i]; l++)
//取出元素,放入到arr中
arr[index1++] = bucket[i][l];
//第一轮处理后,需要bucketElementCounts[i] = 0
bucketElementCounts[i] = 0;
//第二轮,针对每个元素的十位进行排序处理
for (int j = 0;j < arr.length;j++)
//取出元素的十位值
int digitOfElement = arr[j] / 10 % 10;
//放入到对应的桶中
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
bucketElementCounts[digitOfElement]++;
//按照这个桶的顺序(一维数组的下标依次取出数据,放到原来的数组)
index1 = 0;
//遍历每一个桶
for (int i = 0; i < bucket.length; i++)
//如果桶中有数据,才取出
if (bucketElementCounts[i] != 0)
//循环该桶
for (int l = 0;l< bucketElementCounts[i]; l++)
//取出元素,放入到arr中
arr[index1++] = bucket[i][l];
//第二轮处理后,需要bucketElementCounts[i] = 0
bucketElementCounts[i] = 0;
//第三轮,针对每个元素的百位进行排序处理
for (int j = 0;j < arr.length;j++)
//取出元素的百位值
int digitOfElement = arr[j] / 100 % 10;
//放入到对应的桶中
bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
bucketElementCounts[digitOfElement]++;
//按照这个桶的顺序(一维数组的下标依次取出数据,放到原来的数组)
index1 = 0;
//遍历每一个桶
for (int i = 0; i < bucket.length; i++)
//如果桶中有数据,才取出
if (bucketElementCounts[i] != 0)
//循环该桶
for (int l = 0;l< bucketElementCounts[i]; l++)
//取出元素,放入到arr中
arr[index1++] = bucket[i][l];
//第三轮处理后,需要bucketElementCounts[i] = 0
bucketElementCounts[i] = 0;
以上是关于Day567.基数排序 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章