基数排序(Java)

博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

基数排序(桶排序)介绍

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

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

基数排序(Radix Sort)是桶排序的扩展

基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。

基数排序基本思想

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

特点

空间换时间,稳定

代码

  1. package cn.guizimo.sort;
  2. import java.util.Arrays;
  3. public class RadixSort {
  4. public static void main(String[] args) {
  5. int arr[] = {53,45,6,378,15,234,78};
  6. System.out.println("排序前");
  7. System.out.println(Arrays.toString(arr));
  8. radixSort(arr);
  9. System.out.println("排序后");
  10. System.out.println(Arrays.toString(arr));
  11. }
  12. public static void radixSort(int arr[]) {
  13. //获取最大位数
  14. int max = arr[0];
  15. for (int i = 1; i < arr.length; i++) {
  16. if (arr[i] > max) {
  17. max = arr[i];
  18. }
  19. }
  20. //计算位数
  21. int maxLength = (max + "").length();
  22. int[][] bucket = new int[10][arr.length];
  23. int[] bucketElemtCounts = new int[10];
  24. for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
  25. for (int j = 0; j < arr.length; j++) {
  26. int digitOfElemt = arr[j] / n % 10;
  27. bucket[digitOfElemt][bucketElemtCounts[digitOfElemt]] = arr[j];
  28. bucketElemtCounts[digitOfElemt]++;
  29. }
  30. int index = 0;
  31. for (int k = 0; k < bucketElemtCounts.length; k++) {
  32. if (bucketElemtCounts[k] != 0) {
  33. for (int l = 0; l < bucketElemtCounts[k]; l++) {
  34. arr[index++] = bucket[k][l];
  35. }
  36. }
  37. bucketElemtCounts[k] = 0;
  38. }
  39. System.out.println("第"+(i+1)+"轮排序");
  40. System.out.println(Arrays.toString(arr));
  41. }
  42. }
  43. }
测试

测试速度

  1. package cn.guizimo.sort;
  2. import java.util.Arrays;
  3. public class RadixSort {
  4. public static void main(String[] args) {
  5. int max = 80000;
  6. int[] arr = new int[max];
  7. for (int i = 0; i < max; i++) {
  8. arr[i] = (int)(Math.random() * 80000);
  9. }
  10. long date1 = System.currentTimeMillis();
  11. radixSort(arr);
  12. long date2 = System.currentTimeMillis();
  13. System.out.println("位移式希尔排序"+max+"数组的时间为:"+(date2-date1));
  14. }
  15. public static void radixSort(int arr[]) {
  16. //获取最大位数
  17. int max = arr[0];
  18. for (int i = 1; i < arr.length; i++) {
  19. if (arr[i] > max) {
  20. max = arr[i];
  21. }
  22. }
  23. //计算位数
  24. int maxLength = (max + "").length();
  25. int[][] bucket = new int[10][arr.length];
  26. int[] bucketElemtCounts = new int[10];
  27. for (int i = 0, n = 1; i < maxLength; i++, n *= 10) {
  28. for (int j = 0; j < arr.length; j++) {
  29. int digitOfElemt = arr[j] / n % 10;
  30. bucket[digitOfElemt][bucketElemtCounts[digitOfElemt]] = arr[j];
  31. bucketElemtCounts[digitOfElemt]++;
  32. }
  33. int index = 0;
  34. for (int k = 0; k < bucketElemtCounts.length; k++) {
  35. if (bucketElemtCounts[k] != 0) {
  36. for (int l = 0; l < bucketElemtCounts[k]; l++) {
  37. arr[index++] = bucket[k][l];
  38. }
  39. }
  40. bucketElemtCounts[k] = 0;
  41. }
  42. }
  43. }
  44. }

感谢

尚硅谷

万能的网络

以及勤劳的自己

关注公众号: 归子莫,获取更多的资料,还有更长的学习计划

基数排序(Java)的更多相关文章

  1. 基数排序 java 实现

    基数排序 java 实现 Wikipedia: Radix sort geeksforgeeks: Radix sort 数学之美番外篇:快排为什么那样快 Java排序算法总结(八):基数排序 排序八 ...

  2. 基本排序算法——基数排序java实现

    基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...

  3. 基数排序---Java实现+C++实现

    基数排序是基于桶排序实现的,总之基本思想是:先基于个位进行桶排序,更新原序列:再基于十位进行桶排序,更新原序列-- code1:java import java.util.*; public clas ...

  4. 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)

    转载请注明原文地址: http://www.cnblogs.com/ygj0930/p/6639353.html  比较和非比较排序 快速排序.归并排序.堆排序.冒泡排序等比较排序,每个数都必须和其他 ...

  5. 基数排序——Java实现

    一.基数排序思想 相比其它排序,主要是利用比较和交换,而基数排序则是利用分配和收集两种基本操作.基数 排序是一种按记录关键字的各位值逐步进行排序的方法.此种排序一般适用于记录的关键字为整数类型的情况. ...

  6. java各种排序实现

    排序是程序开发中一种非常常见的操作,对一组任意的数据元素(或记录)经过排序操作后,就可以把他们变成一组按关键字排序的有序队列. 对一个排序算法来说,一般从下面3个方面来衡量算法的优劣: 时间复杂度:它 ...

  7. 各种排序算法及其java程序实现

    各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort)1. 基本思想 ...

  8. 20172302 《Java软件结构与数据结构》第五周学习总结

    2018年学习总结博客总目录:第一周 第二周 第三周 第四周 第五周 教材学习内容总结 查找 查找即在某项目组中寻找某一指定目标元素,或确定该组中并不存在此元素.对其进行查找的项目组称为查找池. 1. ...

  9. Java数据结构和算法(四)赫夫曼树

    Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...

  10. 排序算法及其java实现

    各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort) 1. 基本思 ...

随机推荐

  1. flex布局以及常用属性。

    (1)flex布局排列 会消除块状属性,所有与块状相关的属性将失效,比如块状元素会独占一行,如图2,设置flex后会在一行排列

  2. 【Hadoop】mapreduce环形缓冲区

    mapreduce过程解析 数据在map中怎么写入磁盘? 数据:经过map逻辑处理过后的数据(key,value)- 磁盘:本地磁盘 环形缓冲区 1.为什么要环形缓冲区? 答:使用环形缓冲区,便于写入 ...

  3. JavaWeb项目:旅游网站【涉及各种知识】

    JQuery异步请求(ajax) $.ajax({ // 请求方式为get或者post等 type: "GET", // 服务器响应的数据类型 dataType: "js ...

  4. Html超链接和表单

    超链接 a href="链接地址" target="链接打开方式" title="当鼠标放在连接上显示的文字"></a>链 ...

  5. 初步理解 MySQL数据库

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1. 索引是做什么的? 索引用于快速找出在某个列中有一特定值的行.不使用索引,MYSQL必须从第1条记录 ...

  6. Java实现 LeetCode 498 对角线遍历

    498. 对角线遍历 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示. 示例: 输入: [ [ 1, 2, 3 ], [ ...

  7. Java实现 洛谷 P1010 幂次方

    输入输出样例 输入 #1 1315 输出 #1 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0) import java.util.Scanner; pu ...

  8. Java实现第八届蓝桥杯9算数式

    9算数式 题目描述 观察如下的算式: 9213 x 85674 = 789314562 左边的乘数和被乘数正好用到了1~9的所有数字,每个1次. 而乘积恰好也是用到了1~9的所有数字,并且每个1次. ...

  9. PAT 有几个PAT

    字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T). 现 ...

  10. RabbitMQ(2)---高级使用

    1.ack和限流 ack也就是消息确认签收,分为自动签收和手动签收.之前的交换机demo中:channel.basicConsume(queueName,true, consumer);  第二个参数 ...