基数排序+速度测试
package com.atguigu.sort;import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;/*** @創建人 wdl* @創建時間 2021/3/22* @描述*/
public class RadixSort {public static void main(String[] args) {//53, 3, 542, 748, 14, 214
// int arr[] = {53, 3, 542, 748, 14, 214};//創建一個80000個的隨機數組int[] arr = new int[80000];for (int i = 0; i < 80000; i++) {arr[i]=(int)(Math.random()*8000000);//生成一個[0,8000000)數}Date data1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");String data1str = simpleDateFormat.format(data1);System.out.println("排序前的時間是="+data1str);radixSort(arr);Date data2 = new Date();String data2str = simpleDateFormat.format(data2);System.out.println("排序后的時間是="+data2str);}//基數排序方法public static void radixSort(int[] arr) {//根據前面的推導過程,我們可以得到最終的基數排序代碼//1.得到數組中最大的數的位數int max = arr[0];//假設第一個數就是最大數for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}//得到最大數是幾位數int maxLength = (max + "").length();//定義一個二維數組,表示10個桶,每個桶就是一個一維數組//說明//1.二維數組包含10個一維數組//2.為了防止在放入數的時候,數據溢出,則每個一維數組(桶),大小定為arr.length//3.明確,基數排序是使用空間換時間的經典算法int[][] bucket = new int[10][arr.length];//為了記錄每個桶中,實際存放了多少個數據,我們定義一個一維數組類記錄各個桶每次放入的數據個數//可以這樣理解//bucketElementCounts[0],記錄的就是bucket[0]桶的放入數據個數int[] bucketElementCounts = new int[10];//這里我們使用循環將代碼處理for (int i = 0,n=1; i < maxLength; i++,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 index = 0;//遍歷每一個桶,并將桶中的數據放入到原來的數組for (int k = 0; k < bucketElementCounts.length; k++) {//如果桶中,有數據,我們才放入到原數組if (bucketElementCounts[k] != 0) {//循環該桶即K個桶(即第K個一維數組),放入for (int l = 0; l < bucketElementCounts[k]; l++) {//取出元素放入到arrarr[index] = bucket[k][l];index++;}}//第1輪處理后,需要將每個bucketElementCounts[k]=0!!!!bucketElementCounts[k] = 0;}// System.out.println("第"+(i+1)+"輪,對個位的排序處理arr=" + Arrays.toString(arr));}// //第1輪(針對每個元素的個位進行排序處理)
// for (int j = 0; j < arr.length; j++) {
// //取出每個元素的個位
// int digitofElement = arr[j] % 10;
// //放入到對應的桶中
// bucket[digitofElement][bucketElementCounts[digitofElement]] = arr[j];
// bucketElementCounts[digitofElement]++;
// }
//
// //按照這個桶的排序(一維數組的下標依次取出數據,放入原來的數組)
// int index = 0;
// //遍歷每一個桶,并將桶中的數據放入到原來的數組
// for (int k = 0; k < bucketElementCounts.length; k++) {
// //如果桶中,有數據,我們才放入到原數組
// if (bucketElementCounts[k] != 0) {
// //循環該桶即K個桶(即第K個一維數組),放入
// for (int l = 0; l < bucketElementCounts[k]; l++) {
// //取出元素放入到arr
// arr[index] = bucket[k][l];
// index++;
// }
// }
//
// //第1輪處理后,需要將每個bucketElementCounts[k]=0!!!!
// bucketElementCounts[k]=0;
//
// }
//
// System.out.println("第1輪,對個位的排序處理arr=" + Arrays.toString(arr));// //第2輪(針對每個元素的十位進行排序處理)
// for (int j = 0; j < arr.length; j++) {
// //取出每個元素的十位
// int digitofElement = arr[j]/10% 10;
// //放入到對應的桶中
// bucket[digitofElement][bucketElementCounts[digitofElement]] = arr[j];
// bucketElementCounts[digitofElement]++;
// }
//
// //按照這個桶的排序(一維數組的下標依次取出數據,放入原來的數組)
// index=0;
// //遍歷每一個桶,并將桶中的數據放入到原來的數組
// for (int k = 0; k < bucketElementCounts.length; k++) {
// //如果桶中,有數據,我們才放入到原數組
// if (bucketElementCounts[k] != 0) {
// //循環該桶即K個桶(即第K個一維數組),放入
// for (int l = 0; l < bucketElementCounts[k]; l++) {
// //取出元素放入到arr
// arr[index] = bucket[k][l];
// index++;
// }
// }
// //第2輪處理后,需要將每個bucketElementCounts[k]=0!!!!
// bucketElementCounts[k]=0;
// }
//
// System.out.println("第2輪,對十位的排序處理arr=" + Arrays.toString(arr));
//
//
// //第3輪(針對每個元素的百位進行排序處理)
// for (int j = 0; j < arr.length; j++) {
// //取出每個元素的百位
// int digitofElement = arr[j]/10 /10% 10;
// //放入到對應的桶中
// bucket[digitofElement][bucketElementCounts[digitofElement]] = arr[j];
// bucketElementCounts[digitofElement]++;
// }
//
// //按照這個桶的排序(一維數組的下標依次取出數據,放入原來的數組)
// index=0;
// //遍歷每一個桶,并將桶中的數據放入到原來的數組
// for (int k = 0; k < bucketElementCounts.length; k++) {
// //如果桶中,有數據,我們才放入到原數組
// if (bucketElementCounts[k] != 0) {
// //循環該桶即K個桶(即第K個一維數組),放入
// for (int l = 0; l < bucketElementCounts[k]; l++) {
// //取出元素放入到arr
// arr[index] = bucket[k][l];
// index++;
// }
// }
// //第3輪處理后,需要將每個bucketElementCounts[k]=0!!!!
// bucketElementCounts[k]=0;
// }
//
// System.out.println("第3輪,對百位的排序處理arr=" + Arrays.toString(arr));}}
總結
- 上一篇: 看了通信领域中信息的处理的三种方式我终于
- 下一篇: 生成赫夫曼编码表