基数排序+推导过程
圖解
代碼實(shí)現(xiàn)
package com.atguigu.sort;import java.util.Arrays;/*** @創(chuàng)建人 wdl* @創(chuàng)建時(shí)間 2021/3/22* @描述*/ public class RadixSort {public static void main(String[] args) {//53, 3, 542, 748, 14, 214int arr[] = {53, 3, 542, 748, 14, 214};radixSort(arr);}//基數(shù)排序方法public static void radixSort(int[] arr) {//根據(jù)前面的推導(dǎo)過程,我們可以得到最終的基數(shù)排序代碼//1.得到數(shù)組中最大的數(shù)的位數(shù)int max = arr[0];//假設(shè)第一個(gè)數(shù)就是最大數(shù)for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}//得到最大數(shù)是幾位數(shù)int maxLength = (max + "").length();//定義一個(gè)二維數(shù)組,表示10個(gè)桶,每個(gè)桶就是一個(gè)一維數(shù)組//說明//1.二維數(shù)組包含10個(gè)一維數(shù)組//2.為了防止在放入數(shù)的時(shí)候,數(shù)據(jù)溢出,則每個(gè)一維數(shù)組(桶),大小定為arr.length//3.明確,基數(shù)排序是使用空間換時(shí)間的經(jīng)典算法int[][] bucket = new int[10][arr.length];//為了記錄每個(gè)桶中,實(shí)際存放了多少個(gè)數(shù)據(jù),我們定義一個(gè)一維數(shù)組類記錄各個(gè)桶每次放入的數(shù)據(jù)個(gè)數(shù)//可以這樣理解//bucketElementCounts[0],記錄的就是bucket[0]桶的放入數(shù)據(jù)個(gè)數(shù)int[] bucketElementCounts = new int[10];//這里我們使用循環(huán)將代碼處理for (int i = 0,n=1; i < maxLength; i++,n*=10) {//(針對每個(gè)元素的對應(yīng)位進(jìn)行排序處理),第一次是十位,第二次是百位。。。。for (int j = 0; j < arr.length; j++) {int digitofElement = arr[j]/n % 10;//放入到對應(yīng)的桶中bucket[digitofElement][bucketElementCounts[digitofElement]] = arr[j];bucketElementCounts[digitofElement]++;}//按照這個(gè)桶的排序(一維數(shù)組的下標(biāo)依次取出數(shù)據(jù),放入原來的數(shù)組)int index = 0;//遍歷每一個(gè)桶,并將桶中的數(shù)據(jù)放入到原來的數(shù)組for (int k = 0; k < bucketElementCounts.length; k++) {//如果桶中,有數(shù)據(jù),我們才放入到原數(shù)組if (bucketElementCounts[k] != 0) {//循環(huán)該桶即K個(gè)桶(即第K個(gè)一維數(shù)組),放入for (int l = 0; l < bucketElementCounts[k]; l++) {//取出元素放入到arrarr[index] = bucket[k][l];index++;}}//第1輪處理后,需要將每個(gè)bucketElementCounts[k]=0!!!!bucketElementCounts[k] = 0;}System.out.println("第"+(i+1)+"輪,對個(gè)位的排序處理arr=" + Arrays.toString(arr));}// //第1輪(針對每個(gè)元素的個(gè)位進(jìn)行排序處理) // for (int j = 0; j < arr.length; j++) { // //取出每個(gè)元素的個(gè)位 // int digitofElement = arr[j] % 10; // //放入到對應(yīng)的桶中 // bucket[digitofElement][bucketElementCounts[digitofElement]] = arr[j]; // bucketElementCounts[digitofElement]++; // } // // //按照這個(gè)桶的排序(一維數(shù)組的下標(biāo)依次取出數(shù)據(jù),放入原來的數(shù)組) // int index = 0; // //遍歷每一個(gè)桶,并將桶中的數(shù)據(jù)放入到原來的數(shù)組 // for (int k = 0; k < bucketElementCounts.length; k++) { // //如果桶中,有數(shù)據(jù),我們才放入到原數(shù)組 // if (bucketElementCounts[k] != 0) { // //循環(huán)該桶即K個(gè)桶(即第K個(gè)一維數(shù)組),放入 // for (int l = 0; l < bucketElementCounts[k]; l++) { // //取出元素放入到arr // arr[index] = bucket[k][l]; // index++; // } // } // // //第1輪處理后,需要將每個(gè)bucketElementCounts[k]=0!!!! // bucketElementCounts[k]=0; // // } // // System.out.println("第1輪,對個(gè)位的排序處理arr=" + Arrays.toString(arr));// //第2輪(針對每個(gè)元素的十位進(jìn)行排序處理) // for (int j = 0; j < arr.length; j++) { // //取出每個(gè)元素的十位 // int digitofElement = arr[j]/10% 10; // //放入到對應(yīng)的桶中 // bucket[digitofElement][bucketElementCounts[digitofElement]] = arr[j]; // bucketElementCounts[digitofElement]++; // } // // //按照這個(gè)桶的排序(一維數(shù)組的下標(biāo)依次取出數(shù)據(jù),放入原來的數(shù)組) // index=0; // //遍歷每一個(gè)桶,并將桶中的數(shù)據(jù)放入到原來的數(shù)組 // for (int k = 0; k < bucketElementCounts.length; k++) { // //如果桶中,有數(shù)據(jù),我們才放入到原數(shù)組 // if (bucketElementCounts[k] != 0) { // //循環(huán)該桶即K個(gè)桶(即第K個(gè)一維數(shù)組),放入 // for (int l = 0; l < bucketElementCounts[k]; l++) { // //取出元素放入到arr // arr[index] = bucket[k][l]; // index++; // } // } // //第2輪處理后,需要將每個(gè)bucketElementCounts[k]=0!!!! // bucketElementCounts[k]=0; // } // // System.out.println("第2輪,對十位的排序處理arr=" + Arrays.toString(arr)); // // // //第3輪(針對每個(gè)元素的百位進(jìn)行排序處理) // for (int j = 0; j < arr.length; j++) { // //取出每個(gè)元素的百位 // int digitofElement = arr[j]/10 /10% 10; // //放入到對應(yīng)的桶中 // bucket[digitofElement][bucketElementCounts[digitofElement]] = arr[j]; // bucketElementCounts[digitofElement]++; // } // // //按照這個(gè)桶的排序(一維數(shù)組的下標(biāo)依次取出數(shù)據(jù),放入原來的數(shù)組) // index=0; // //遍歷每一個(gè)桶,并將桶中的數(shù)據(jù)放入到原來的數(shù)組 // for (int k = 0; k < bucketElementCounts.length; k++) { // //如果桶中,有數(shù)據(jù),我們才放入到原數(shù)組 // if (bucketElementCounts[k] != 0) { // //循環(huán)該桶即K個(gè)桶(即第K個(gè)一維數(shù)組),放入 // for (int l = 0; l < bucketElementCounts[k]; l++) { // //取出元素放入到arr // arr[index] = bucket[k][l]; // index++; // } // } // //第3輪處理后,需要將每個(gè)bucketElementCounts[k]=0!!!! // bucketElementCounts[k]=0; // } // // System.out.println("第3輪,對百位的排序處理arr=" + Arrays.toString(arr));}}總結(jié)
- 上一篇: 微信如何查看2018年度数据报告?微信查
- 下一篇: 常用算法的对比