`
shenyu
  • 浏览: 122970 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

排序-基数

阅读更多

基数排序是种与众不同的排序方法,它不是基于比较和交换。其理论时间效率是O(n)。
基数排序的基本想法是将每个数字按照一定的基数拆分,然后根据每一位将数据反复排序。


例如:
    代排序数组:{7,3,1,5,4}
    基数:2

用基数表示源排序数组:{111,011,001,101,100}
首先按照第0位(从右边数起),根据0位是0,还是1将数组中数据放入0队列或1队列中,然后再将数据从两个队列中取出,这样便完成了对0位的排序。
    此时数组变成了{100,111,011,001,101}
然后在按照此算法对第1位操作:
    此时数组变成了{100,001,101,111,011}
然后在按照此算法对第2位操作:
    此时数组变成了{001,011,100,101,111}
没有更高的位数,排序结束。
    翻译成十进制:{1,3,4,5,7}


基数排序时间与n成正比,也和数值的相对于基数的倍数成正比。
但当排序数据量比较大的情况下,一般来说,数值用基数表示的位数也会相应变大。一般来说实际中基数排序一般会蜕化到O(n * log n)


注意基数选取多少都可以,但是用2的幂可以直接使用位操作,大部分计算机位操作的速度都比较快。另外基数排序只能排列关键值为整数的数据。

排序过程中需要使用队列,为了简单期间,此处使用了用数组作为底层数据结构支撑的队列,但这样对空间浪费较大,实际中可以考虑使用用链表作为底层数据结构支撑的队列,关于队列的数据结构请参见(LinkedQueue 队Queue 队

 

class Queue {   
    int[] values;   
    int head = -1;   
    int tail = -1;   
    Queue(int size) {   values  = new int[size]; }   
    boolean isEmpty() { return head == tail; }   
    void put(int value) {   values[++head] = value; };   
    int get() { return values[++tail]; };   
    void clean() { head = -1; tail = -1; }   
}   
  
class Radix {   
    public static void main(String[] args) {   
        int[] a = {6,4,3,2,4,1,2};   
        sort(a,4);   
        println(a);   
    }   
  
    /**  
     * @param radix 2的幂  
     * @param a 源数据数组  
     */  
    public static void sort(int[] a,int radix) {   
        int base = 1<<radix;   
        Queue[] q = new Queue[base];   
        for(int i=0; i<base; i++) {         
            q[i] = new Queue(a.length);   
        }   
  
        int bit = 0;   
        int sum;   
        do {   
            sum = 0; //判断是否要再继续   
            for(int i: a) {   
                int remain = i >> bit;   
                q[remain&(base - 1)].put(i);   
                sum |= remain;   
            }   
            bit += radix;   
            //从队列中取出数据,放入原数组中   
            int i = 0;   
            for(int j=0; j<q.length; j++) {   
                while(!q[j].isEmpty()) a[i++] = q[j].get();   
                q[j].clean();   
            }   
        } while(sum > 0);   
    }   
  
    public static void println(int[] a) {   
        for(int i: a) System.out.print(i + " ");   
        System.out.println();   
    }   
}  

 

3
1
分享到:
评论

相关推荐

    数据结构教学课件:第23讲 归并排序-基数排序.pdf

    《数据结构教学课件:第23讲 归并排序-基数排序》 在计算机科学领域,数据结构和算法是核心部分,它们直接影响程序的效率和性能。本讲主要涉及两种重要的排序算法:归并排序和基数排序。这两种排序算法在处理大量...

    算法-理论基础- 排序- 基数排序(包含源程序).rar

    **基数排序**是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这个过程可以类比为人类按身高排队,然后再按照年龄、姓氏等其他特征进行进一步的排序。基数排序在处理...

    C语言版的排序方法---基数排序.docx

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。在这个C语言实现的版本中,主要包含两个核心函数:`RadixCountSort` 和 `RadixSort`。 `RadixCountSort` ...

    8.12-8.19-冒泡-选择-插入-希尔-快速-归并-基数-堆排序-排序算法Swift代码及UI演示

    7. 基数排序(Radix Sort):基数排序是一种非比较型排序算法,通过按位数从低到高进行排序,适用于整数排序。它的复杂度可以达到线性O(nk),其中k是数字的最大位数。 8. 堆排序(Heap Sort):堆排序利用了堆这种...

    lemon-guide-基数排序

    JAVADevOps 基数排序 基数排序 基数排序 基数排序 基数排序

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

    Java 基数排序算法详解 基数排序(Radix Sort)是一种非比较排序算法,它的基本思想是将待排序的数组按照位数(个位、十位、百位)进行划分,然后依次对每个位上的数字进行排序,最终得到有序的数组。基数排序的...

    Algorithm-基数排序

    :art: 基数排序 基数排序 基数排序 基数排序 基数排序

    基数排序-radix sort

    基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。这种排序方法对于大数据量的处理非常有效,尤其适合于数据范围远大于内存大小的情况。以下是基数排序的详细...

    《数据结构与算法》-李春葆 实验报告-典型排序算法实践-基数排序

    《数据结构与算法》实验报告-典型排序算法实践-基数排序 本实验报告的主要目的是通过基数排序算法的实现来掌握三类内部排序的设计思想、适用范围与算法实现,并深入理解和掌握优化排序算法的设计思想和实现过程。 ...

    基数排序-flash演示

    基数排序-flash演示 可自己输入数据...........

    山东大学-基数排序课程设计

    java版本的基数排序,支持过程演示,支持数据编辑,插入,删除,生成随机数等功能

    基数排序-数据结构

    基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。在这个程序中,基数排序被实现为一个名为`RadixSort`的函数,用于对`SLList`类型的链表进行排序。`SLList`...

    数据结构实验报告--链式基数排序算法.doc

    链式基数排序是一种非比较型整数排序算法,它的原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。在描述中提到的实验报告中,主要目标是实现一个链式基数排序算法,用于对一组数据进行最低位优先的排序...

    基数排序、堆排序、希尔排序、直接插入排序

    这里我们将深入探讨四种常见的排序算法:基数排序、堆排序、希尔排序和直接插入排序。 首先,基数排序是一种非比较型整数排序算法,它的基本思想是将整数按位数切割成不同的数字,然后按每个位数分别比较。基数排序...

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

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

    插入排序冒泡排序堆排序基数排序选择排序快速排序源码

    例如,插入排序和选择排序适合小规模数据,冒泡排序虽然效率较低但实现简单,堆排序和快速排序在处理大规模数据时有较好性能,而基数排序则能处理非负整数排序。在实际开发中,根据具体需求选择合适的排序算法是非常...

    常见算法源代码速查.rar.rar

    - 基数排序 - 桶排序 2. **搜索算法**: - 线性搜索 - 二分搜索 - 哈希搜索 - 深度优先搜索(DFS) - 广度优先搜索(BFS) 3. **图论算法**: - Dijkstra最短路径算法 - Bellman-Ford算法 - Floyd-...

    Java各种排序算法

    - 数据类型:若数据有特定分布(如整数或有序),特定的排序算法可能更具优势,如基数排序对整数排序特别有效。 - 数据已有顺序:如果数据已接近有序,插入排序和冒泡排序在最坏情况下可以达到线性时间复杂度。 - ...

Global site tag (gtag.js) - Google Analytics