基数排序代码详解(排序算法)

核心思想是按每一位的大小去排序,因为一位数的范围是0-9,就将每一位的数字提出来然后依次排序。上代码,代码中有备注。

图解:

在这里插入图片描述

代码详解:

package com.sort;

import java.util.*;

/**
 * @author yn
 * @description 基数排序
 * 目前做的全是正数,如果出现负数,先把所有的负数分为一组(正负数分离),
 * 将负号全部去掉,然后排列,排完之后反序一次,负数的大小刚好相反。
 */
public class BasicSort {
    public void sort (int[] array){
        //获取最大值;要看排几次,主要看这个最大值有几位;
        int max = 0;
        for (int i=0;i<array.length;i++){
            if (max<array[i]){
                max = array[i];
            }
        }

        //获取最大值位数;
        int times = 0;
        while (max>0){
            max/=10;times++;//求取这个最大值的位数,依次除以10;直到为0;
        }
        List<ArrayList> queue = new ArrayList<>();//多维数组
        for (int i=0;i<10;i++){
            ArrayList q = new ArrayList();
                queue.add(q);//由于数字的特殊性,大数组中要添加10个小数组;
        }

        //开始比较,重点
        for (int i=0;i<times;i++){
            for (int j=0;j<array.length;j++){
                //获取每次要比较的那个数字;不管是哪个位置上的;
                //获取对应位的值(i为0是个位,1是十位,2是百位);
                int x = array[j]%(int)Math.pow(10, i+1)/(int)Math.pow(10, i);
                ArrayList q = queue.get(x);
               //把元素添加至对应下标数组;在小数组中添加原array的数值;
                q.add(array[j]); 
                queue.set(x, q);
            }
            //开始收集;
            int count = 0;
            for (int j =0;j<10;j++){
                while (queue.get(j).size()>0){
                    ArrayList<Integer> q = queue.get(j);//拿到每一个数组;
                    array[count] = q.get(0);
                    q.remove(0);
                    count++;
                }
            }
        }
    }

    public static void main(String[] args){
        BasicSort bs = new BasicSort();
        int[] a = new int[]{12,3,4,52,234,45,67,21,5,67,7};
        bs.sort(a);
        for (int num:a){
            System.out.print(" " + num);
        }
    }
}

输出: 3 4 5 7 12 21 45 52 67 67 234

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值