• 排序算法之基数排序


    基数排序(桶排序)基本介绍

    • 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort),它是通过键值各个位的值,将要排序的元素分配至“某些桶中”,达到排序的目的

    • 基数排序法是属于稳定性的排序,基数排序法是效率高的稳定性排序法

    • 基数排序是桶排序的扩展

    • 基数排序是188年赫尔曼.何乐礼发明的,实现思路:将整数按位数切割成不同的数字,然后按每个位数进行比较

    基数排序的基本思想

    1. 将所有带比较数值统一位同样的数位长度,数位较短的数前面补0,然后从最低位开始,依次进行依次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列

    代码:

    package com.gcy.sort;

    import java.util.Arrays;

    /**
    * 基数排序
    * @author Administrator
    *
    */
    public class RadixSort {

    public static void main(String[] args) {
    int[] arr= {53,3,542,748,14,214};
    radixSort(arr);

    }
    /**
    * 基数排序
    * @param arr
    */
    public static void radixSort(int[] arr) {
    //定义一个二维数组,表示10个桶每个桶就是一个一维数组
    int [][]bucket=new int[10][arr.length];
    //为了记录每个桶中,实际存放了多少数据,定义一个一维数组来记录各个桶的每次存放数据的个数
    //bucketCounts[0]记录的是第一个桶中存放的数据个数
    int [] bucketCounts=new int[10];
    //最终代码
    //.得到数组中最大数的位数,依次来判断它需要通过几轮排序
    int max=arr[0];//假定数组中的第一个就是最大的
    for(int i=1;i<arr.length;i++) {
    if(max<arr[i]) {
    max=arr[i];
    }
    }
    //判断最大数是几位数
    int maxLength=(max+"").length();

    for(int i=0,n=1;i<maxLength;i++,n*=10) {
    //(针对每个元素的各个位进行排序处理)第一次是个位;第二次是十位
    for(int j=0;j<arr.length;j++) {
    //取出每个元素的个位数
    int digitOfElement=arr[j]/n%10;
    //放入到对应的桶中
    bucket[digitOfElement][bucketCounts[digitOfElement]]=arr[j];
    bucketCounts[digitOfElement]++;
    }
    //按照桶的顺序(一维数组的下标依次取出数据,放到原来的数组中)
    int index=0;
    //遍历每一个桶,并将桶中的数据放入到arr[]中
    for(int k=0;k<bucketCounts.length;k++) {
    //如果桶中有数据,就喜爱那个数据取出
    if(bucketCounts[k]!=0) {
    //循环该桶,即第k个桶
    for(int l=0;l<bucketCounts[k];l++) {
    //取出元素,放入到arr[]中
    arr[index]=bucket[k][l];
    index++;
    }
    }
    bucketCounts[k]=0;
    }
    System.out.println("第"+(i+1)+"轮arr="+Arrays.toString(arr));
    }








    /*//定义一个二维数组,表示10个桶每个桶就是一个一维数组
    int [][]bucket=new int[10][arr.length];

    //为了记录每个桶中,实际存放了多少数据,定义一个一维数组来记录各个桶的每次存放数据的个数
    //bucketCounts[0]记录的是第一个桶中存放的数据个数
    int [] bucketCounts=new int[10];
    //第一轮排序(针对每个元素的个位进行排序处理)
    for(int j=0;j<arr.length;j++) {
    //取出每个元素的个位数
    int digitOfElement=arr[j]%10;
    //放入到对应的桶中
    bucket[digitOfElement][bucketCounts[digitOfElement]]=arr[j];
    bucketCounts[digitOfElement]++;
    }
    //按照桶的顺序(一维数组的下标依次取出数据,放到原来的数组中)
    int index=0;
    //遍历每一个桶,并将桶中的数据放入到arr[]中
    for(int k=0;k<bucketCounts.length;k++) {
    //如果桶中有数据,就喜爱那个数据取出
    if(bucketCounts[k]!=0) {
    //循环该桶,即第k个桶
    for(int l=0;l<bucketCounts[k];l++) {
    //取出元素,放入到arr[]中
    arr[index]=bucket[k][l];
    index++;
    }
    }
    }
    System.out.println(Arrays.toString(arr));*/
    }

    }

    截图:

    有兴趣的,可以尝试写一下,第二轮,第三轮的代码,其实和第一轮非常相似,只需要修改其中很少的东西就可以了

    常用排序算法的总结和对比

  • 相关阅读:
    014-CallbackServlet代码
    PaymentServlet代码
    013-PaymentUtils工具类模板
    案例30-在线支付
    案例29-购物车提交订单
    案例28-清空购物车
    案例27-购物车删除单一商品
    案例26-购物车
    案例25-servlet的抽取
    在Eclipse或工作空间中 ,复制或修改项目后,把项目部署后发现还是原来的项目名称
  • 原文地址:https://www.cnblogs.com/juddy/p/13775949.html
Copyright © 2020-2023  润新知