`

排序算法篇(基数排序)

阅读更多
基本解法
第一步
以LSD为例,假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39
第二步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
第三步
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。
Java实现代码:   
package com.algorithm.sort; 
     
    import java.util.Arrays; 
     
    public class RadixSort { 
     
        //基于计数排序的基数排序算法 
        private static void radixSort(int[] array,int radix, int distance) { 
            //array为待排序数组 
            //radix,代表基数 
            //代表排序元素的位数 
             
            int length = array.length; 
            int[] temp = new int[length];//用于暂存元素 
            int[] count = new int[radix];//用于计数排序 
            int divide = 1; 
             
            for (int i = 0; i < distance; i++) { 
                 
                System.arraycopy(array, 0,temp, 0, length); 
                Arrays.fill(count, 0); 
                 
                for (int j = 0; j < length; j++) { 
                    int tempKey = (temp[j]/divide)%radix; 
                    count[tempKey]++; 
                } 
                 
                for (int j = 1; j < radix; j++) { 
                    count [j] = count[j] + count[j-1]; 
                } 
                 
                //个人觉的运用计数排序实现计数排序的重点在下面这个方法             
                for (int j = length - 1; j >= 0; j--) { 
                    int tempKey = (temp[j]/divide)%radix; 
                    count[tempKey]--; 
                    array[count[tempKey]] = temp[j]; 
                } 
                 
                divide = divide * radix;                 
                 
            } 
                     
        } 
         
         
        /**
         * @param args
         */ 
        public static void main(String[] args) { 
         
            int[] array = {3,2,3,2,5,333,45566,2345678,78,990,12,432,56}; 
            radixSort(array,10,7); 
            for (int i = 0; i < array.length; i++) { 
                System.out.print("  " + array[i]); 
            } 
             
     
        } 
     
    } 
分享到:
评论

相关推荐

    数据结构学习笔记排序算法:基数排序

    数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数排序数据结构学习笔记排序算法:基数...

    超快速排序算法,性能优于快速排序算法和基数排序算法

    传统的排序算法如快速排序和基数排序各有优缺点:快速排序算法因其简洁的结构和较好的平均性能而广受欢迎,但在最坏的情况下其性能会退化至O(N^2);基数排序虽然具有稳定的O(N)时间复杂度,但由于其算法结构较为复杂...

    详解Java常用排序算法-基数排序

    基数排序(Radix Sort)是一种非比较排序算法,它的基本思想是将待排序的数组按照位数(个位、十位、百位)进行划分,然后依次对每个位上的数字进行排序,最终得到有序的数组。基数排序的时间复杂度为 O(d(n+k)),...

    经典排序算法之基数排序

    **基数排序**是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这个过程可以类比为分桶的概念,从低位到高位依次进行,最后合并所有桶得到有序序列。基数排序在处理大...

    基数排序算法 java实现

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种算法对于大数据量的排序尤其有效,因为其时间复杂度为线性,即O(n*k),其中n是待排序的元素数量,k是每...

    排序算法之基数排序源代码

    基数排序是另一种线性的排序算法,但比起计数排序,更适用于排序的元素比较大的情况,其关键之处在于对于每一位的排序必须使用稳定的排序算法,而计数排序是较好的选择。

    最快的排序算法 计算机最快的算法-史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机!...,排序算法数据结构

    基数排序算法是一种高效的排序算法,它的工作原理是通过将数组按照数字的每个位数排序,以达到排序的目的。基数排序算法的时间复杂度为O(nk),因此它适合大规模的数据排序。 9.桶排序算法 桶排序算法是一种高效的...

    基数排序算法

    算法是基数排序,运行时间只有O(n),比较好。

    基数排序算法实现

    基数排序算法,这是分不错的算法,实现起来有点难,用静态链表实现,每次改变结点的指向,希望有用,多多指教

    数据结构排序算法汇总包-直接插入排序 折半插入排序 2—路插入排序 表插入排序 希尔排序 起泡排序 快速排序 简单选择排序 树形选择排序 堆排序 归并排序链式基数排序

    实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...

    基数排序算法.zip

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种算法是通过分配、收集和再分配的步骤来实现的,它不依赖于元素之间的比较,而是依赖于数字的位数。这种...

    c++各种排序算法选择排序 冒泡排序 插入排序 基数排序 快速排序 归并排序

    采用c++描述了各种排序算法,包括选择排序 冒泡排序 插入排序 基数排序 快速排序 归并排序 。实验内容 1、创建排序类。 2、提供操作:选择排序、冒泡排序、插入排序、*基数排序、*快速排序、*归并排序。 3、*能够...

    归并排序,基数排序算法比较

    归并排序和基数排序是两种不同的排序算法,它们在实现方式和效率特点上存在显著差异。 **归并排序**是一种基于分治策略的排序算法。它的基本思想是将待排序的序列分成两个长度相等(或近似相等)的部分,分别对这两...

    常用的排序算法总结(各种内部排序算法和外部排序算法)

    除了直接插入排序,还有其他类型的内部排序算法,如交换排序(如快速排序)、选择排序、归并排序、基数排序以及二叉排序树排序等。每种算法都有其独特的优点和适用场景,比如快速排序在平均情况下的时间复杂度为O...

    Radix Sort (基数排序)排序算法

    ### Radix Sort (基数排序) 排序算法详解 #### 一、算法介绍与应用场景 基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达...

    C++写基数排序算法

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。在C++中实现基数排序,主要涉及到数组、计数排序以及位操作等技术。以下是关于基数排序及其C++实现的详细解释...

    C经典算法之基数排序法

    **基数排序**是一种典型的非比较性排序算法,它属于分配式排序的一种,其基本思想是将待排序的数据分成不同的组或者桶,然后按照一定的规则对这些组进行排序。基数排序通常适用于整数排序,特别是当整数范围不大但...

    经典排序算法,有选择排序,冒泡排序,交换排序,谢尔排序,插入排序基数排序

    根据给定的文件信息,我们将深入探讨几种经典的排序算法,包括选择排序、冒泡排序、交换排序、希尔排序、插入排序以及基数排序。这些算法在计算机科学领域内有着广泛的应用,各自具有独特的特点和适用场景。 ### 1....

    数据结构之排序算法排序算法 快速冒泡 堆 希尔 直接插入 直接选择 基数 箱 桶

    本篇文章将深入探讨标题和描述中提到的九大排序算法:快速排序、冒泡排序、堆排序、希尔排序、直接插入排序、直接选择排序、基数排序、箱排序和桶排序。 1. **快速排序**:快速排序是一种基于分治策略的排序算法,...

Global site tag (gtag.js) - Google Analytics