zoukankan      html  css  js  c++  java
  • 排序算法之基数排序

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

    • 基数排序(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));*/
    }

    }

    截图:

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

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

  • 相关阅读:
    优化网站设计(十七):延迟或按需加载内容
    优化网站设计(七):避免在CSS中使用表达式
    SharePoint Server 2013发现之旅系列文章的概述和相关资源
    优化网站设计(十六):为AJAX请求使用GET方法
    优化网站设计(二十):使用多个主机来平衡负载
    优化网站设计(六):在文档底部放置脚本定义或引用
    优化网站设计(十八):预加载内容
    优化网站设计(二十八):避免使用Filters(滤镜)
    优化网站设计(三十五):避免将img的src属性设置为空白
    优化网站设计(三十四):将组件直接打包到页面
  • 原文地址:https://www.cnblogs.com/juddy/p/13775949.html
Copyright © 2011-2022 走看看