首页 > 编程语言 > 详细

基数排序及十大排序总结

时间:2020-10-11 12:35:02      阅读:52      评论:0      收藏:0      [点我收藏+]

基数排序

  • 基数排序就是先对最后一位进行分类排序,然后再对倒数第二位进行排序,然后倒数第三位,直到最后一位,每次对每一位进行排序时,都会不断变得有序

  • 由于每位数大小位0-9,所以我们需要10个桶来排序

  • 如何求个/十/百位上得数是多少呢?int radix = (int) (a[j] / Math.pow(10, i)) % 10; :因为要求个位就是对整个数取余数10,如果是十位的话先将整个数除以10再取余,如果百位的话就除以100,因此我们可以利用Math的pow函数,来决定每次到底是除以多少

  • 时间复杂度位O(kn)、空间复杂度为O(n + k),是稳定排序,且非原地排序

    技术分享图片

  • 代码实现

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.LinkedList;
    
    /**
     * @Description: 基数排序
     * @Author: LinZeLiang
     * @Date: 2020-10-11
     */
    public class RadixSort {
    
        public static void main(String[] args) {
            int[] a = {9, 54, 3, 6, 43, 11, 27, 98, 43, 5, 2, 89, 1, 4, 8, 16, 20};
    
            radixSort(a);
    
            System.out.println(Arrays.toString(a));
    
        }
    
        private static void radixSort(int[] a) {
            //获取最大值
            int max =a[0];
            for (int i = 1; i < a.length; i++) {
                if (max < a[i]) {
                    max = a[i];
                }
            }
    
            //获取最大的数的位数
            int num = 0;
            while (max != 0) {
                max /= 10;
                num++;
            }
    
            //创建10个桶
            int bucketNum = 10;
            ArrayList<LinkedList<Integer>> bucketList = new ArrayList<>(bucketNum);
    
            //初始化桶
            for (int i = 0; i < bucketNum; i++) {
                bucketList.add(new LinkedList<Integer>());
            }
    
            //进行桶的每一趟排序
            for (int i = 0; i < num; i++) {
                for (int j = 0; j < a.length; j++) {
                    //获取最后一位数
                    //如果是第二趟循环,就除以10然后再取余,这样子就可以实时获取固定位的数,而不改变原数组
                    int radix = (int) (a[j] / Math.pow(10, i)) % 10;
                    //放进对应的桶里
                    bucketList.get(radix).add(a[j]);
                }
    
                //合并原数组
                int k = 0;
                for (LinkedList<Integer> integers : bucketList) {
                    for (Integer integer : integers) {
                        a[k++] = integer;
                    }
                    //取出来之后将这个桶清空,供下一次循环使用
                    integers.clear();
                }
            }
        }
    }
    

十大排序总结

我们来看看十大排序他们的算法性质:

技术分享图片

基数排序及十大排序总结

原文:https://www.cnblogs.com/linzedian/p/13796710.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!