java位图_Java 位图法排序的使用方法
java JDK里面容器类的排序算法使用的主要是插入排序和归并排序,可能不同版本的实现有所不同,关键代码如下:
/**
* Performs a sort on the section of the array between the given indices
* using a mergesort with exponential search algorithm (in which the merge
* is performed by exponential search). n*log(n) performance is guaranteed
* and in the average case it will be faster then any mergesort in which the
* merge is performed by linear search.
*
* @param in -
* the array for sorting.
* @param out -
* the result, sorted array.
* @param start
* the start index
* @param end
* the end index + 1
*/
@SuppressWarnings("unchecked")
private static void mergeSort(Object[] in, Object[] out, int start,
int end) {
int len = end - start;
// use insertion sort for small arrays
if (len <= SIMPLE_LENGTH) {
for (int i = start + 1; i < end; i++) {
Comparable current = (Comparable) out[i];
Object prev = out[i - 1];
if (current.compareTo(prev) < 0) {
int j = i;
do {
out[j--] = prev;
} while (j > start
&& current.compareTo(prev = out[j - 1]) < 0);
out[j] = current;
}
}
return;
}
int med = (end + start) >>> 1;
mergeSort(out, in, start, med);
mergeSort(out, in, med, end);
// merging
// if arrays are already sorted - no merge
if (((Comparable) in[med - 1]).compareTo(in[med]) <= 0) {
System.arraycopy(in, start, out, start, len);
return;
}
int r = med, i = start;
// use merging with exponential search
do {
Comparable fromVal = (Comparable) in[start];
Comparable rVal = (Comparable) in[r];
if (fromVal.compareTo(rVal) <= 0) {
int l_1 = find(in, rVal, -1, start + 1, med - 1);
int toCopy = l_1 - start + 1;
System.arraycopy(in, start, out, i, toCopy);
i += toCopy;
out[i++] = rVal;
r++;
start = l_1 + 1;
} else {
int r_1 = find(in, fromVal, 0, r + 1, end - 1);
int toCopy = r_1 - r + 1;
System.arraycopy(in, r, out, i, toCopy);
i += toCopy;
out[i++] = fromVal;
start++;
r = r_1 + 1;
}
} while ((end - r) > 0 && (med - start) > 0);
// copy rest of array
if ((end - r) <= 0) {
System.arraycopy(in, start, out, i, med - start);
} else {
System.arraycopy(in, r, out, i, end - r);
}
}
看到编程珠玑上有一个很有趣的排序算法-位图法其思想是用1位来表示[0~n-1]中的整数是否存在。1表示存在,0表示不存在。即将正整数映射到bit集合中,每一个bit代表其映射的正整数是否存在。
比如{1,2,3,5,8,13}使用下列集合表示:
0 1 1 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0
伪代码如下:
for (i in [0~n-1]) bit[i] = 0;
for(i in [0~n-1])
if (i in input file)
bit[i] = 1
for(i in [0~n-1])
if(bit[i] == 1)
output i
用java 代码尝试下,效率果然不错:
public class javaUniqueSort {
public static int[] temp = new int[1000001];
public static List tempList = new ArrayList();
public static int count;
public static void main(final String[] args) {
List firstNum = new ArrayList();
List secondNum = new ArrayList();
for (int i = 1; i <= 1000000; i++) {
firstNum.add(i);
secondNum.add(i);
}
Collections.shuffle(firstNum);
Collections.shuffle(secondNum);
getStartTime();
Collections.sort(firstNum);
getEndTime("java sort run time ");
getStartTime();
secondNum = uniqueSort(secondNum);
getEndTime("uniqueSort run time ");
}
public static List uniqueSort(final List uniqueList) {
javaUniqueSort.tempList.clear();
for (int i = 0; i < javaUniqueSort.temp.length; i++) {
javaUniqueSort.temp[i] = 0;
}
for (int i = 0; i < uniqueList.size(); i++) {
javaUniqueSort.temp[uniqueList.get(i)] = 1;
}
for (int i = 0; i < javaUniqueSort.temp.length; i++) {
if (javaUniqueSort.temp[i] == 1) {
javaUniqueSort.tempList.add(i);
}
}
return javaUniqueSort.tempList;
}
public static void getStartTime() {
javaShuffle.start = System.nanoTime();
}
public static void getEndTime(final String s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}
运行时间:
java sort run time : 1257737334ns
uniqueSort run time : 170228290ns
java sort run time : 1202749828ns
uniqueSort run time : 169327770ns
如果有重复数据,可以修改下:
public class javaDuplicateSort {
public static List tempList = new ArrayList();
public static int count;
public static void main(final String[] args) {
Random random = new Random();
List firstNum = new ArrayList();
List secondNum = new ArrayList();
for (int i = 1; i <= 100000; i++) {
firstNum.add(i);
secondNum.add(i);
firstNum.add(random.nextInt(i + 1));
secondNum.add(random.nextInt(i + 1));
}
Collections.shuffle(firstNum);
Collections.shuffle(secondNum);
getStartTime();
Collections.sort(firstNum);
getEndTime("java sort run time ");
getStartTime();
secondNum = uniqueSort(secondNum);
getEndTime("uniqueSort run time ");
}
public static List uniqueSort(final List uniqueList) {
javaDuplicateSort.tempList.clear();
int[] temp = new int[200002];
for (int i = 0; i < temp.length; i++) {
temp[i] = 0;
}
for (int i = 0; i < uniqueList.size(); i++) {
temp[uniqueList.get(i)]++;
}
for (int i = 0; i < temp.length; i++) {
for (int j = temp[i]; j > 0; j--) {
javaDuplicateSort.tempList.add(i);
}
}
return javaDuplicateSort.tempList;
}
public static void getStartTime() {
javaShuffle.start = System.nanoTime();
}
public static void getEndTime(final String s) {
javaShuffle.end = System.nanoTime();
System.out.println(s + ": " + (javaShuffle.end - javaShuffle.start) + "ns");
}
}
这种算法还是有很明显的局限性的,比如说要知道数据中最大的数值,更重要的是数据的疏密程度,比如说最大值为1000000而要数组大小只有100,那么效率会下降的非常明显。。。。。但是,使用位图法进行排序,确实让人眼前一亮。位图法通常是用来存储数据,判断某个数据存不存在或者判断数组是否存在重复 。
java位图_Java 位图法排序的使用方法相关推荐
- list快速默认排序java_1. java Collections.sort()实现List排序的默认方法和自定义方法...
1.java提供的默认list排序方法 主要代码: List list = new ArrayList();list.add("刘媛媛"); list.add("王硕&q ...
- java中穷举法排序_java穷举法小案例
最近几天伤病没有更新 今天好点 看了一下基础的算法 现在简单更新一下 --穷举法 一.甲 .乙.丙 三位球迷分别预测进入半决赛的四队A.B.C.D的名次如下: 甲:A 第一名 .B 第二名 乙:C ...
- java冒泡法排序实例_Java冒泡法排序实例
public class TestBubbleUp { /* 冒泡排序算法 */ public static int[] sort(int[] m) { int theLenth = m.length ...
- java冒泡排序_JAVA实现经典排序算法(冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序、快速排序)...
冒泡排序 依次比较相邻的元素,若发现逆顺序,则交换.小的向前换,大的向后换,本次循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,说明每个元素都不比它后面的元素大,至此排序完成. import ...
- java解码_Java数组已排序解码
java解码 排序是我们在计算机科学中学习的第一个算法. 排序是一个非常有趣的领域,它有大约20多种算法,而且总是很难确定哪种算法最好. 排序算法的效率是根据占用的时间和所需的空间来衡量的. 一些时间 ...
- java代码_Java 代码实现排序算法
阅读本文约需要8分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...
- 选择排序java代码_JAVA简单选择排序算法原理及实现
简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...
- 希尔排序java写法_Java实现希尔排序
华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序.如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作). 看到了这个,我想试试希尔排序,就学学. ...
- java 交集_Java大集合求交集的方法比较
两个List集合求交集想必学过Java的都知道用系统自带的retainAll()方法,但是在数据量比较大时,这个方法效率并不高,利用空余时间研究了几种数据量较大时求两个集合交集的办法.本文主要研究了J ...
最新文章
- k-means聚类算法从入门到精通
- python opencv 检测特定颜色
- 使用pngquant来压缩png资源缩小apk
- Windows Mobile 6.5.3 Developer Tool Kit
- SQL Server 2005,2008 正则表达式 替换函数应用详解
- 关于SQL Server安装文件挂起错误解决办法
- Windows Phone开发之路(14) 加载位图
- JavaScript 源型链
- json返回的img图片被原样输出_爬取百度图片,并下载至本地
- 秘笈——掌控时间管理的工具
- 计算机辅助设计(湖南省首届“湘邮科技杯”大学生程序设计大赛试题)
- BooKuMaker0.6.04操作手册
- 撰写MLA格式的毕业论文,需留意下边几个文件格式标准
- DXP改变字体的方法
- 非标产品和标准产品的区别(关于3C)
- php账号管理工具,微信公共账号第三方管理工具开发(一)
- linux通过无线网卡上网,在Ubuntu中使用PHS无线网卡上网
- Python 教程之 Pandas(14)—— 使用 Pandas 进行数据分析
- pandas查看数据
- unity2D 动态漫画剧本(给猛虎桥章节做动画演示二)
热门文章
- jquery的ajax查询数据库,jquery中使用ajax获取远程页面信息
- 第 20 次 CSP认证 202009-5 密信与计数
- 序列(【CCF】NOI Online能力测试 提高组第一题)
- hihocoder第237周:三等分带权树
- [转]如果说中国程序员技术偏低,原因可能在这里
- 关于我在1024程序员节还在焊板子这件事儿
- leetcode939.MinimumAreaRectangle
- 【Ionic】Ionic/cmd提示 'node' 不是内部或外部命令,也不是可运行的程序
- HashMap遍历有序性问题——map.entrySet()的无序性
- Java多线程编程(1)--Java中的线程