排序算法Java实现(基数排序)

 1 package sorting;
 2
 3 /**
 4  * 基数排序
 5  * 平均O(d(n+r)),最好O(d(n+r)),最坏O(d(n+r));空间复杂度O(n+r);稳定;较复杂
 6  * d为位数,r为分配后链表的个数
 7  * @author zeng
 8  *
 9  */
10 public class JishuPaixu {
11
12     public static int getNumInPos(int num, int pos) {
13         int tmp = 1;
14         for (int i = 0; i < pos - 1; i++) {
15             tmp *= 10;
16         }
17         return (num / tmp) % 10;
18     }
19
20     public static int getMaxWeishu(int[] b) {
21         int max = b[0];
22         for (int i = 0; i < b.length; i++) {
23             if (b[i] > max)
24                 max = b[i];
25         }
26         int tmp = 1, i = 1;
27         while (true) {
28             tmp *= 10;
29             if (max / tmp != 0) {
30                 i++;
31             } else
32                 break;
33         }
34         return i;
35     }
36
37     public static int[] jishupaixu(int[] a, int d) {
38
39         int[][] array = new int[10][a.length + 1];
40         for (int i = 0; i < 10; i++) {
41             array[i][0] = 0;// array[i][0]记录第i行数据的个数
42         }
43         for (int pos = 0; pos < d; pos++) {
44             System.out.println("start fenpei");
45             for (int i = 0; i < a.length; i++) {// 分配过程
46                 int num = getNumInPos(a[i], pos + 1);
47                 int index = ++array[num][0];
48                 System.out.println("a[" + i + "]-->" + "array[" + num + "]["
49                         + index + "]");
50                 array[num][index] = a[i];
51             }
52             System.out.println("start shouji");
53             for (int i = 0, j = 0; i < 10; i++) {// 收集过程
54                 for (int k = 1; k <= array[i][0]; k++) {
55                     System.out.println("a[" + j + "]=" + "array[" + i + "]["
56                             + k + "]");
57                     a[j++] = array[i][k];
58                 }
59                 array[i][0] = 0;// 复位,下一个pos时还需使用
60             }
61         }
62
63         return a;
64     }
65
66     public static void main(String[] args) {
67         int[] b = { 49, 38, 65, 197, 76, 213, 27, 50 };
68         jishupaixu(b, getMaxWeishu(b));
69         for (int i : b)
70             System.out.print(i + " ");
71
72     }
73 }
时间: 2024-10-10 11:48:43

排序算法Java实现(基数排序)的相关文章

排序算法Java实现

排序算法Java实现 排序算法的分类: 内部排序,在排序过程中,全部记录放在内存中,称为内部排序: 外部排序,在排序过程中需要使用外部存储(磁盘),则称为外部排序. 主要介绍内部排序: 插入排序:直接插入排序.二分法插入排序.希尔排序 选择排序:简单选择排序.堆排序 交换排序:冒泡排序.快速排序 归并排序 基数排序 插入排序 直接插入排序 基本思想:对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余记录为无序序列.接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的

排序算法七:基数排序(Radix sort)

上一篇提到了计数排序,它在输入序列元素的取值范围较小时,表现不俗.但是,现实生活中不总是满足这个条件,比如最大整形数据可以达到231-1,这样就存在2个问题: 1)因为m的值很大,不再满足m=O(n),计数排序的时间复杂也就不再是线性的: 2)当m很大时,为计数数组申请的内存空间会很大: 为解决这两个问题,本篇讨论基数排序(Radix sort),基数排列的思想是: 1)将先按照某个基数将输入序列的每个元素划分成若干部分,每个部分对排序结果的影响是有优先级的: 2)先按低优先级排序,再按高优先级

常见排序算法导读(10)[基数排序]

与前面介绍的7种排序算法不同,基数排序(Radix Sort)是基于多关键字排序的一种排序算法.也就是说,前面介绍的7种排序算法是建立在对单个元素关键字比较的基础之上,而基数排序则是采用"分配"与"收集"的办法,用对多关键字进行排序的思想实现对单个关键字的排序. 基数排序的典型例子当然就是扑克牌排序啦,几乎所有的数据结构教科书都会讲到,原因是形象易懂.每张扑克牌都有两个关键字:花色和面值.假定有序关系为: 花色: 黑桃 < 红桃 < 梅花 < 方块

排序算法大全之基数排序

排序算法大全之--基数排序 基数排序是一种分配式排序,又成为桶子法排序 LSD(我们以最低位优先) 第一步:假设原有一串数字如下: 23,45,12,32,43 遍历这些数的个位数字,将他们分别装进编号为0到9的桶中 桶  0:为空,因为这些数中没有个位数为0的 桶  1:空 桶  2:12,32 桶  3:23,43 桶  4:空 桶  5:45 桶  6:空 桶  7:空 桶  8:空 桶  9:空 第二步 接下来将这些桶中的数据依次串起来,排成一排: 12,32,23,43,45 接下来,

经典排序算法(Java实现)

以下程序均将数据封装于DataWrap数据包装类中,如下所示: 1 //数据包装类 2 class DataWrap implements Comparable<DataWrap> 3 { 4 int data; 5 String flag; 6 public DataWrap(int data,String flag) 7 { 8 this.data = data; 9 this.flag = flag; 10 } 11 //重写compareTo方法 12 public int compa

数据结构排序算法Java实现

闲的无聊又拿起了大学的数据结构的书看起来 <数据结构(c语言版)>严蔚敏 吴伟民编著. 里面有几个排序算法,感觉挺好玩的,就想着写出来玩玩. package test.sort; /** * @Title: TODO * @Description: TODO * @author: * @date: 2014-8-10 上午11:20:43 * */ public class quickSort { private static int datas[] = {23,42,12,45,56,63,

九大排序算法Java实现

之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂度.稳定性分类: 2.排序算法问题描述与实现 2.1冒泡排序(交换排序-稳定) [问题描述]对于一个int数组,请编写一个冒泡排序算法,对数组元素排序. 问题分析:冒泡排序,顾名思义,从前往后遍历,每次遍历在末尾固定一个最大值. 易错点:每次内层循环结束都会在末尾确定一个元素的位置,因此内层循环的判

八大排序算法Java(转)

目录(?)[-] 概述 插入排序直接插入排序Straight Insertion Sort 插入排序希尔排序Shells Sort 选择排序简单选择排序Simple Selection Sort 选择排序堆排序Heap Sort 交换排序冒泡排序Bubble Sort 交换排序快速排序Quick Sort 归并排序Merge Sort 桶排序基数排序Radix Sort 总结 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序

Java排序算法-Java入门|Java基础课程

Java 排序算法 1. 课程目标 排序是任何语言都会使用到的功能之一,然成果排序的算法有很多,对空间的要求及其时间效率也不尽相同. 本文章以Java语言示例,通过对空间要求.时间效率要求,来对比各种排序算法的使用场景 2.适用对象 Java语言初学者 Java算法爱好者 3.相关概念 3.1 排序概念 排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 3.2 排序算法 排序算法,就是如何使得记录按照要求排列的方法. 排序算法在很多领域得到相当地重视,尤其是在

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插