Java AmericanFlagSort

/**
* <html>
* <body>
* <P> Copyright 1994-2018 JasonInternational </p>
* <p> All rights reserved.</p>
* <p> Created on 2018年4月10日 </p>
* <p> Created by Jason</p>
* </body>
* </html>
*/
package cn.ucaner.algorithm.sorts; /**
* An American flag sort is an efficient, in-place variant of radix sort that
* distributes items into hundreds of buckets. Non-comparative sorting
* algorithms such as radix sort and American flag sort are typically used to
* sort large objects such as strings, for which comparison is not a unit-time
* operation.
* <p>
* Family: Bucket.<br>
* Space: In-place.<br>
* Stable: False.<br>
* <p>
* Average case = O(n*k/d)<br>
* Worst case = O(n*k/d)<br>
* Best case = O(n*k/d)<br>
* <p>
* NOTE: n is the number of digits and k is the average bucket size
* <p>
* @see <a href="https://en.wikipedia.org/wiki/American_flag_sort">American Flag Sort (Wikipedia)</a>
* <br>
* @author Justin Wetherell <phishman3579@gmail.com>
*/
public class AmericanFlagSort { private static final int NUMBER_OF_BUCKETS = 10; // 10 for base 10 numbers private AmericanFlagSort() { } public static Integer[] sort(Integer[] unsorted) {
int numberOfDigits = getMaxNumberOfDigits(unsorted); // Max number of digits
int max = 1;
for (int i = 0; i < numberOfDigits - 1; i++)
max *= 10;
sort(unsorted, 0, unsorted.length, max);
return unsorted;
} public static void sort(Integer[] unsorted, int start, int length, int divisor) {
// First pass - find counts
int[] count = new int[NUMBER_OF_BUCKETS];
int[] offset = new int[NUMBER_OF_BUCKETS];
int digit = 0;
for (int i = start; i < length; i++) {
int d = unsorted[i];
digit = getDigit(d, divisor);
count[digit]++;
}
offset[0] = start + 0;
for (int i = 1; i < NUMBER_OF_BUCKETS; i++) {
offset[i] = count[i - 1] + offset[i - 1];
}
// Second pass - move into position
for (int b = 0; b < NUMBER_OF_BUCKETS; b++) {
while (count[b] > 0) {
int origin = offset[b];
int from = origin;
int num = unsorted[from];
unsorted[from] = -1;
do {
digit = getDigit(num, divisor);
int to = offset[digit]++;
count[digit]--;
int temp = unsorted[to];
unsorted[to] = num;
num = temp;
from = to;
} while (from != origin);
}
}
if (divisor > 1) {
// Sort the buckets
for (int i = 0; i < NUMBER_OF_BUCKETS; i++) {
int begin = (i > 0) ? offset[i - 1] : start;
int end = offset[i];
if (end - begin > 1)
sort(unsorted, begin, end, divisor / 10);
}
}
} private static int getMaxNumberOfDigits(Integer[] unsorted) {
int max = Integer.MIN_VALUE;
int temp = 0;
for (int i : unsorted) {
temp = (int) Math.log10(i) + 1;
if (temp > max)
max = temp;
}
return max;
} private static int getDigit(int integer, int divisor) {
return (integer / divisor) % 10;
}
}

  

Java AmericanFlagSort的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  3. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

  4. 论:开发者信仰之“天下IT是一家“(Java .NET篇)

    比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...

  5. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  6. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  7. 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用

    有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...

  8. Java多线程基础学习(二)

    9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...

  9. Java多线程基础学习(一)

    1. 创建线程    1.1 通过构造函数:public Thread(Runnable target, String name){}  或:public Thread(Runnable target ...

随机推荐

  1. [Java]在JAVA中使用Oracle的INSERT ALL语法进行批量插入

    Oracle也提供了类似MySQL的批量插入语法,只是稍微别扭些,具体代码如下: package com.hy; import java.sql.Connection; import java.sql ...

  2. zblog文件大小超出,上传成功但插入不了

    在zblogphp时,经常会遇到需要上传2m以上的文件或图片,这个时候就需要修改默认上传文件的大小了.看了很多地方的文章都解决不了,后面在麒麟杰博客找到相关解决办法.   工具/原料   zblogp ...

  3. It’s worth noting值得注意的是

    It’s worth noting that in JavaScript applications the Model is often connected via Ajax to a back-en ...

  4. 未清SO关闭处理

    使用:  SD_SALESDOCUMENT_CHANGE   关闭订单 DATA: ls_header_in LIKE bapisdhd1 . DATA: ls_header_inx LIKE bap ...

  5. Div 居中对齐(水平、垂直)

    一:水平居中对齐 ***********************************************************************************  示例图 代码 ...

  6. C#读取带命名空间的xml

    首先带有命名空间的xml读取可以使用Xml.Linq,也可以使用xpath,本文将采用xpath的方式解析. 原文参考了:https://www.cnblogs.com/duanjt/p/544054 ...

  7. node节点扩容

    node节点扩容: 安装docker 部署 kubelet组件 拷贝admin.conf 拷贝bootstrap.conf 安装cni网络插件 拷贝ca.pem 证书,配置kubelet-config ...

  8. LODOP中纸张高度不定超文本和纯文本对比

    关于纸张高度不定的小票打印,建议使用纯文本进行设计,避免纸张高度引起变形,或超文本解析差异造成一些影响:LODOP纸张高度不定的纯文本累计高度 上面的链接的博文里,纯文本可通过间距和高度值累计,得出最 ...

  9. react 点击事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. [学习笔记] Blender 常用工具 移动与旋转,缩放, 变换

    点击上面的移动图标之后,可在X,Y,Z轴移动物体. shift+S 之后,可有更多的移动选项. 旋转:可沿X,Y, Z 进行旋转 缩放 还可输入缩放的具体数值,更精确. 变换 可同时做移动.旋转.缩放 ...