基数排序 java 实现
基数排序 java 实现
算法概念
基数排序(radix sort)是一种非比较型整数排序算法,不同于比较排序算法(例如:堆排序、归并排序、快速排序),它不需要比较关键字的大小,而是根据关键字中各位的值,通过对排序的N个关键字进行若干趟“分配”与“收集”来实现排序的。根据其原理,基数排序不仅适用于整数排序,还可以进行字符串(比如名字或日期)和特定格式的浮点数排序。基数排序是稳定性的排序,在某些时候,基数排序法的效率高于其它的比较性排序法。
算法思想
基数排序可以分为两类:最高位优先(Most Significant Digit first)法和最低位优先(Least Significant Digit first)法。LSD法从最低位到最高位来对关键字进行处理,MSD法反之。
以LSD法为例:
- 取得每个整数的个位数值(最低位)。
- 将所有整数按取得的个位数值进行分组,分组过程中,同组整数保持其在原队列里的顺序(保证了算法的稳定性)。
- 按每位数对队列进行重复分组,最终得到一个有序队列。
算法实现
package com.lygedi.sort;
import java.util.ArrayList;
import java.util.List;
public class RadixSort {
public void sort(int[] a){
List[] bucket = new List[10];
for(int i=0;i<10;i++){
List<Integer> al = new ArrayList<Integer>();
bucket[i] = al;
}
int maxDigit = 1;
int currentDigit = 1;
int n = 1;
while(currentDigit<=maxDigit){
for(int i=0;i<a.length;i++){
int p = a[i];
if(currentDigit==1){
int temp = (int) Math.ceil(Math.log10(p));
if(temp>maxDigit){
maxDigit = temp;
}
}
int radix = (p / n) % 10;
bucket[radix].add(p);
}
int index = 0;
for(int i=0;i<10;i++){
ArrayList<Integer> al = (ArrayList<Integer>) bucket[i];
for(int j=0;j<al.size();j++){
a[index] = (int) al.get(j);
index++;
}
al.clear();
}
for(int i=0;i<a.length;i++){
System.out.print(a[i]);
System.out.print(",");
}
System.out.println(currentDigit);
currentDigit++;
n *= 10;
}
}
public static void main(String[] args) {
int a[]={49,38,1,100,1000,1165,9,76,13,4127,49,8,34,10,12,649,49,56,200,412,762,98,97,100,55,
51,13,5,4,62,99,98999,54,56,179,17,18,11123,34,56,15,35,25,53,51,0,12013,732,999999,89,
853202,2342,3,20,1,201,1000,10000,100000,38,29,1234567,3,381,23,123,9123,1,2,12397,861};
RadixSort qs = new RadixSort();
qs.sort(a);
System.out.println(a.length);
for(int i=0;i<a.length;i++)
System.out.println(Integer.toString(i)+"-"+a[i]);
}
}
基数排序 java 实现的更多相关文章
- 基本排序算法——基数排序java实现
基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...
- 基数排序---Java实现+C++实现
基数排序是基于桶排序实现的,总之基本思想是:先基于个位进行桶排序,更新原序列:再基于十位进行桶排序,更新原序列-- code1:java import java.util.*; public clas ...
- 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)
转载请注明原文地址: http://www.cnblogs.com/ygj0930/p/6639353.html 比较和非比较排序 快速排序.归并排序.堆排序.冒泡排序等比较排序,每个数都必须和其他 ...
- 基数排序——Java实现
一.基数排序思想 相比其它排序,主要是利用比较和交换,而基数排序则是利用分配和收集两种基本操作.基数 排序是一种按记录关键字的各位值逐步进行排序的方法.此种排序一般适用于记录的关键字为整数类型的情况. ...
- java各种排序实现
排序是程序开发中一种非常常见的操作,对一组任意的数据元素(或记录)经过排序操作后,就可以把他们变成一组按关键字排序的有序队列. 对一个排序算法来说,一般从下面3个方面来衡量算法的优劣: 时间复杂度:它 ...
- 各种排序算法及其java程序实现
各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort)1. 基本思想 ...
- 20172302 《Java软件结构与数据结构》第五周学习总结
2018年学习总结博客总目录:第一周 第二周 第三周 第四周 第五周 教材学习内容总结 查找 查找即在某项目组中寻找某一指定目标元素,或确定该组中并不存在此元素.对其进行查找的项目组称为查找池. 1. ...
- Java数据结构和算法(四)赫夫曼树
Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...
- 排序算法及其java实现
各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序 冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序 一.冒泡排序(BubbleSort) 1. 基本思 ...
随机推荐
- How to parse HTML page data in Windows Phone
1. Navigate to page WebBrowser control browser.Navigate(new Uri("http://www.xxxx.com")); 2 ...
- Mysql5.6主从热备配置
数据库是应用系统的核心,为了保证数据库的安全采用主从热备是很常见的方法,也就是主数据库DDL.DML都将被同步到从数据库. 一. 实验环境 操作系统:windowsserver 2008 R ...
- React Native 中 CSS 的使用
首先声明,此文原作者为黎 跃春 React Native中CSS 内联样式 对象样式 使用Stylesheet.Create 样式拼接 导出样式对象 下面的代码是index.ios.js中的代码: / ...
- 如何使用Google Map API开发Android地图应用
两年前开发过的GoogleMap已经大变样,最近有项目要用到GoogleMap,重新来配置Android GoogleMap开发环境,还真是踩了不少坑. 一.下载Android SDK Manager ...
- WebApp中的页面生命周期及路由管理
最近切换到一个新项目,使用的技术栈是Require+Backbone,鉴于对鞋厂webapp框架的了解,发现这个新项目有些缺陷,主要是单纯依赖Backbone造成的,也就是Backbone的好和坏都在 ...
- Windows下使用WSRM限制MongoDB内存
有个项目用到了MongoDB,我们是在WINDOWS 2008 64位环境下部署的,为啥不部署到linux下面呢,我们没那么多服务器,只能将就一下了. 大家都知道Mongodb吃内存太厉害了,如果不重 ...
- iOS用户信息单例的创建
UserInfo.h + (UserInfo *) sharedInstance; UserInfo.m #import "UserInfo.h" static UserInfo ...
- HTML JQuery 技巧总结
元素之间的操作 $(".level1").children() 获取到所有相邻的子元素$(".level1").children("a") ...
- Redis学习笔记(3)-Hash
package cn.com; import java.util.HashMap; import java.util.List; import java.util.Map; import java.u ...
- Arduino.h
#ifndef Arduino_h #define Arduino_h #include <stdlib.h> #include <stdbool.h> #include &l ...