zoukankan      html  css  js  c++  java
  • 【算法与数据结构】包含负数的基数排序

     1 import java.util.Arrays;
     2 
     3 public class Radix {
     4     //包含负数的基数排序
     5     public static void main(String[] args) {
     6         int[] arr = {53, 3, -6, -542, 74, 214};
     7         radixSort(arr);
     8         System.out.println("基数排序的结果为"+Arrays.toString(arr));
     9     }
    10 
    11     public static void radixSort(int[] arr){
    12         int max = arr[0];//假设第一个值为最大值
    13         for (int i = 0; i<arr.length;i++){
    14             if(arr[i] > max){
    15                 max = arr[i];//寻找最大值
    16             }
    17         }
    18         int maxLength = (max+"").length();//获取最大值的位数
    19         int min = arr[0];//假设第一个值为最小值
    20         for (int i = 0; i<arr.length;i++){
    21             if(arr[i]< min){
    22                 min = arr[i];//寻找最小值
    23             }
    24         }
    25         if (min < 0){//如果最小值小于0就将每个元素都减去这个负数,使得数组中的最小值为0
    26             for(int i = 0; i<arr.length; i++){
    27                 arr[i] -= min;
    28             }
    29         }
    30 
    31         int[][] bucket = new int[10][arr.length];
    32         int[] bucketElementCounts = new int[10];//用于记录每个桶内有多少数据
    33 
    34         for(int i = 0, n=1;i<maxLength;i++,n*=10){
    35             for(int j = 0;j <arr.length;j++){
    36                 int digitOfElement = arr[j] / n % 10;//每次分别取个位、十位、百位。。。
    37                 bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];
    38                 bucketElementCounts[digitOfElement] ++;
    39             }
    40 
    41             int index = 0;
    42             //对每个桶进行遍历
    43             for (int k = 0; k<bucketElementCounts.length; k++){
    44                 if(bucketElementCounts[k] != 0){//只有当前桶内有数据时才遍历该桶进行循环取值
    45                     for(int l = 0; l <bucketElementCounts[k];l++){
    46                         arr[index] = bucket[k][l];
    47                         index++;
    48                     }
    49                 }
    50                 //当取完一个桶时就将其置零,让下一轮重新计数
    51                 bucketElementCounts[k] = 0;
    52             }
    53         }
    54         if (min<0){//如果最小值小于0.则将数组中的每一个数都加上最小值恢复原来的值
    55             for(int i =0;i<arr.length;i++){
    56                 arr[i] += min;
    57             }
    58         }
    59     }   
    60 }
    基数排序的结果为[-542, -6, 3, 53, 74, 214]
  • 相关阅读:
    js用8421码实现10进制转2进制
    什么?toggle(fn1, fn2)函数在1.9版本jq被移除? 来来来,自己撸一个
    js获取鼠标点击的对象,点击另一个按钮删除该对象
    html5小结
    iphone状态栏高度?
    制作手机相册 全屏滚动插件fullpage.js
    js 相关知识整理(一)
    css 居中问题
    进度条
    @Html.Raw()
  • 原文地址:https://www.cnblogs.com/DJames23/p/13306119.html
Copyright © 2011-2022 走看看