数据结构——基数排序

排序过程

以数组 A[6]={23, 14, 101, 72, 84, 11}为例,调用基数排序过程如下图所示:

基本思想是:将整数按位切割成不同的数字,然后对每个数的同一位进行排序。
具体做法:将所有待排序数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序操作。这样从最低位排序一直到最高位排序完毕,数组就变成一个有序数组了。

源码实现

private static void sort(int[] A) {
    int mod = 1; // 位数
    int bit = 4; // 数组中值最大为4位数
    int[][] tempPlace = new int[10][A.length]; // 建造一个大小为10桶。一维为元素的某一位的值,二维为元素的值
    for (int z = 1;z <= bit;z++) { // 循环数组中最大值的位数
        int[] temp = new int[10]; // 保存每个tempPlace桶的当前下标
        for (int i = 0,j = 0;i < A.length;i++,j++) {
            int k = A[i]/mod % 10;
            tempPlace[k][temp[k]] = A[i];
            temp[k]++;
        }
        int length = 0;
        for (int i = 0;length<A.length;i++) {
            for (int j = 0;j < temp[i];j++) {
                A[length++] = tempPlace[i][j];
            }
        }
        mod*=10;
    }
}

参考资料

[1] 基数排序

[2] 算法导论, 8.3 - 基数排序

时间: 2024-10-11 10:37:13

数据结构——基数排序的相关文章

数据结构-基数排序

#include <iostream> using namespace std; void CountSort(int* a,int k,int n){ int s = 1; for(int i=0;i<k;i++){ s *= 10; } int* b = new int[n]; int* c = new int[n]; for(int i=0;i<n;i++){ b[i] = 0; c[i] = 0; } int tmp1 = 0; for(int i=0;i<n;i++

16. 蛤蟆的数据结构进阶十六排序实现之基数排序

16. 蛤蟆的数据结构进阶十六排序实现之基数排序 本篇名言:"社会犹如一条船 ,每人都要有掌舵的准备.--易卜生" 我们来看下基数排序. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47760601 1.  基数排序 基数排序(radix sort)属于"分配式排序"(distributionsort),又称"桶子法"(bucket sort)或bin sort,顾名思义,

小朋友学数据结构(10):基数排序

小朋友学数据结构(10):基数排序 一.基本思想 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位(即个位数)开始,依次进行一次排序.这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列. 与其他排序不同的是,基数排序不涉及数的交换. 基数排序是一种稳定的排序算法. 8.png 二.主要步骤 从上面的计算过程,咱们可以看出,基数排序主要有三个步骤: 1.把所有元素都分配到相应的桶中(因为整数每位数有0~9共十种可能,所以通常需要10个桶) 2.把

【数据结构】非比较排序算法(实现计数排序和基数排序)

● 计数排序 1.算法思想: 计数排序是直接定址法的变形.通过开辟一定大小的空间,统计相同数据出现的次数,然后回写到原序列中. 2.步骤: 1)找到序列中的最大和最小数据,确定开辟的空间大小. 2)开辟空间,利用开辟的空间存放各数据的个数. 3)将排好序的序列回写到原序列中. 具体实现如下: void CountSort(int *arr, int size) {  assert(arr);  int min = arr[0];  int max = arr[0];  int num = 0;

数据结构排序-基数排序

基数排序是跟前面的几种排序算法完全不一样的排序算法,前面的排序算法主要通过关键字之间的比较和移动来实现,而基数排序不需要进行关键字之间的比较,它是借助多关键字的思想来实现的.对于数字,每一位上的数字就是一个关键字,每一位的数字范围就是关键字范围,它的主要过程为:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列,如下图所示.类似从低位到高位比较,就是从次关键字到主关键字比较,

数据结构之排序算法Java实现(4)—— 基数排序法

基数排序算法是计数排序的延伸,计数排序会造成很大的空间浪费,但基数排序法是对位数进行排序,适合于位数之间相差较大的情况,废话不多说,直接上代码: 升序排序法: /** * 基数排序法 * 升序排列 * @param data */ public void sortByAsc(int[] data) { /** step1:确定排序的趟数*/ int max=data[0]; for(int i=1;i<data.length;i++){ if(data[i]>max){ max=data[i]

数据结构作业之用队列实现的基数排序(Java版)

题目: 利用队列实现对某一个数据序列的排序(采用基数排序),其中对数据序列的数据(第1和第2条进行说明)和队列的存储方式(第3条进行说明)有如下的要求: 1)当数据序列是整数类型的数据的时候,数据序列中每个数据的位数不要求等宽,比 如: 1.21.12.322.44.123.2312.765.56 2)当数据序列是字符串类型的数据的时候,数据序列中每个字符串都是等宽的,比 如: "abc","bde","fad","abd",

数据结构基础(15) --基数排序

基数排序是一种借助"多关键字排序"的思想来实现"单关键字排序"的内部排序算法. 实现多关键字排序通常有两种作法:  最低位优先法(LSD) 先对K[0]{基数的最低位}进行排序,并按 K(0) 的不同值将记录序列分成若干子序列之后,分别对 K[1] 进行排序,..., K[d-1]依次类推,直至最后对最次位关键字排序完成为止.   最高位优先法(MSD) 先对 K[d-1]{基数的最高位}进行排序,然后对 K[d-2]进行排序,依次类推,直至对最主位关键字 K[0]

数据结构之——基数排序

编程论到极致,核心非代码,即思想. 所以,真正的编程高手同时是思想独到及富有智慧(注意与聪明区别)的人. 每一个算法都是一种智慧的凝聚或萃取,值得我们学习从而提高自己,开拓思路,更重要的是转换思维角度. 其实,我们大多数人都活在“默认状态”下.没有发觉自己的独特可设置选项-----思想. 言归正传(呵呵!恢复默认状态),以下学习基数排序. [1]基数排序 以前研究的各种排序算法,都是通过比较数据大小的方法对欲排数据序列进行排序整理过程. 而基数排序却不再相同,那么,基数排序是采用怎样的策略进行排