八大基本排序--基数排序

原数组和桶如下:

第一次按照个位排序如下

取出的时候按照从0~9的顺序,且同一个桶中,先放进去的先出来

第二次按照十位排序如下

取出结果如下

第三次次按照百位排序如下

取出结果如下:

此时数组已经有序了

代码思路:

我们排序的次数取决于数组中最大是数字的位数

import java.util.Arrays;

//基数排序
public class RadixSort {

    public static void main(String[] args) {
        int[] arr = { 23, 6, 189, 45, 9, 287, 56, 1, 798, 34, 65, 652, 5 };
        radixSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void radixSort(int[] arr) {
        //先找到这个数组里面最大的数字
        //排多少轮,取决于数组中最大的数字是几位数
        int max=arr[0];
        for(int i=1;i<arr.length;i++) {
            if(arr[i]>max) {
                max = arr[i];
            }
        }
//        System.out.println(max);
        //计算取到的最大值max是几位数:把max变成字符串类型,然后计算其长度
        String maxs = "";
        maxs = maxs+max;
        int maxLen = maxs.length();
//        System.out.println(maxLen);

        //用于临时存放数据的数组(那0-9的十个桶)
        int[][] temp = new int[10][arr.length];
        //用于记录temp中每一个桶中存放数据的数量
        int[] count =new int[10];

        //根据最大长度决定比较的次数
        for(int i= 0, n=1;i<maxLen;i++,n=n*10) {
            //取出数组中每个数字的余数
            for (int j = 0; j < arr.length; j++) {
                int ys = arr[j]/n%10;
                temp[ys][count[ys]] = arr[j];//关键是放在第几列,需要用一个数组辅助计算
                count[ys]++;
            }
//            if (i==0) {
//                for (int[] temps : temp) {
//                    System.out.println(Arrays.toString(temps));
//                }
//                System.out.println(Arrays.toString(count));
//            }
            //
            int index =0;
            //把数字取出来,看count[]数组(记录数量)中的个数,如果个数=0,就不取
            for(int k=0;k<10;k++) {
                if(count[k]!=0) {
                    //遍历temp[][]数组
                    for(int l =0;l<count[k];l++) {
                        arr[index++]=temp[k][l];
                    }
                }
                //把数量置为0
                count[k]=0;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/yuange678/p/10667213.html

时间: 2024-11-09 00:30:34

八大基本排序--基数排序的相关文章

八大基础排序总结

前言 大概花了一周的时间把八大基础排序过了一遍,这篇博文主要是用来回顾一下八大基础排序的要点和一些总结- 回顾: 冒泡排序就这么简单 选择排序就这么简单 插入排序就这么简单 快速排序就这么简单 归并排序就这么简单 堆排序就这么简单 希尔排序就这么简单 基数排序就这么简单 总的来说:快速排序是用得比较广泛的一个排序,也是经常出现的一个排序,应该重点掌握- 二.八大排序总结 2.1冒泡排序 思路: 俩俩交换,大的放在后面,第一次排序后最大值已在数组末尾. 因为俩俩交换,需要n-1趟排序,比如10个数

常见的排序算法(四)( 归并排序,计数排序 , 基数排序)

 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为二路归并. (如果读者不太了解什么叫分治法,可以去看看<算法导论>第一二章.) 归并过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1:否则将第

八大内部排序算法(上)-冒泡、直接插入、简单选择、快速

八大内部排序算法(上)冒泡.直接插入.简单选择.快速 排序分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 1.直接插入排序 将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表.即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止. 要点:设立哨兵,作为临时存储和判断数组边界之用. 直接插入实现如下:

数据结构和算法设计专题之---八大内部排序

摘要: 前几天,看到一篇前辈的博文"程序猿必知的8大排序",不禁的手痒起来,又一次翻开严蔚敏老师的<数据结构>复习了一遍,然后一一的用java去实现,当中有不足之处,还望各位道友指正出来. 先来看看8种排序之间的关系: 第一:直接插入排序 1. 基本思想:在要排序的一组数中,如果前面(n-1) [n>=2] 个数已经是排好顺序的,如今要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此重复循环,直到所有排好顺序. 2. 实例 3. 用java实现 [jav

桶排序/基数排序(Radix Sort)

说基数排序之前,我们先说桶排序: 基本思想:是将阵列分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递回方式继续使用桶排序进行排序).桶排序是鸽巢排序的一种归纳结果.当要被排序的阵列内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n)).但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响.          简单来说,就是把数据分组,放在一个个的桶中,然后对每个桶里面的在进行排序. 例如要对大小为[1..1000]范围内的n个整数A[1..n]排序 首

数据结构排序-基数排序

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

排序——基数排序

五.基数排序 1.基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零.然后,从最低位开始,依次进行一次排序.这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列. 2.实例 3.java实现 复制代码 package com.sort; import java.util.ArrayList; import java.util.List; //稳定 public class 基数排序 { public static void main(String[] ar

大话桶排序 基数排序和计数排序

一:计数排序 (1)当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k).计数排序不是比较排序,排序的速度快于任何比较排序算法.由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存.例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名.但是,计数排序可以用在基数排序中的算法来排序数据范围很大的数组. (2)算法的步骤如下: 1.

计数排序+基数排序

这几天一直在写排序算法,从插入,冒泡,选择到归并和快速再到计数和基数排序.今天来写下计数排序和基数排序吧. 计数排序:对于一组小于k的数组,进行排序.这里要保证输入的关键值在[0..k]之间.貌似很简单,我们先不管什么是计数排序CountSort(A,1,n),先来看一下一段代码. CountPrint(int *A,int n,int k)代码: void CountPrint(int *A,int n,int k){//输入数组A,每个元素都小于k //C[i]用来计算i出现的次数,起初C[