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 位图法排序的使用方法相关推荐

  1. list快速默认排序java_1. java Collections.sort()实现List排序的默认方法和自定义方法...

    1.java提供的默认list排序方法 主要代码: List list = new ArrayList();list.add("刘媛媛"); list.add("王硕&q ...

  2. java中穷举法排序_java穷举法小案例

    最近几天伤病没有更新  今天好点 看了一下基础的算法  现在简单更新一下 --穷举法 一.甲 .乙.丙 三位球迷分别预测进入半决赛的四队A.B.C.D的名次如下: 甲:A 第一名 .B 第二名 乙:C ...

  3. java冒泡法排序实例_Java冒泡法排序实例

    public class TestBubbleUp { /* 冒泡排序算法 */ public static int[] sort(int[] m) { int theLenth = m.length ...

  4. java冒泡排序_JAVA实现经典排序算法(冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序、快速排序)...

    冒泡排序 依次比较相邻的元素,若发现逆顺序,则交换.小的向前换,大的向后换,本次循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,说明每个元素都不比它后面的元素大,至此排序完成. import ...

  5. java解码_Java数组已排序解码

    java解码 排序是我们在计算机科学中学习的第一个算法. 排序是一个非常有趣的领域,它有大约20多种算法,而且总是很难确定哪种算法最好. 排序算法的效率是根据占用的时间和所需的空间来衡量的. 一些时间 ...

  6. java代码_Java 代码实现排序算法

       阅读本文约需要8分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...

  7. 选择排序java代码_JAVA简单选择排序算法原理及实现

    简单选择排序:(选出最小值,放在第一位,然后第一位向后推移,如此循环)第一位与后面每一个逐个比较,每次都使最小的置顶,第一位向后推进(即刚选定的第一位是最小值,不再参与比较,比较次数减1) 复杂度: ...

  8. 希尔排序java写法_Java实现希尔排序

    华杰让我看了一道面试题:现有一段程序S,可以对任意n个数进行排序.如果现在需要对n^2个数进行排序,最少需要调用S多少次?(只允许调用S,不可以做别的操作). 看到了这个,我想试试希尔排序,就学学. ...

  9. java 交集_Java大集合求交集的方法比较

    两个List集合求交集想必学过Java的都知道用系统自带的retainAll()方法,但是在数据量比较大时,这个方法效率并不高,利用空余时间研究了几种数据量较大时求两个集合交集的办法.本文主要研究了J ...

最新文章

  1. k-means聚类算法从入门到精通
  2. python opencv 检测特定颜色
  3. 使用pngquant来压缩png资源缩小apk
  4. Windows Mobile 6.5.3 Developer Tool Kit
  5. SQL Server 2005,2008 正则表达式 替换函数应用详解
  6. 关于SQL Server安装文件挂起错误解决办法
  7. Windows Phone开发之路(14) 加载位图
  8. JavaScript 源型链
  9. json返回的img图片被原样输出_爬取百度图片,并下载至本地
  10. 秘笈——掌控时间管理的工具
  11. 计算机辅助设计(湖南省首届“湘邮科技杯”大学生程序设计大赛试题)
  12. BooKuMaker0.6.04操作手册
  13. 撰写MLA格式的毕业论文,需留意下边几个文件格式标准
  14. DXP改变字体的方法
  15. 非标产品和标准产品的区别(关于3C)
  16. php账号管理工具,微信公共账号第三方管理工具开发(一)
  17. linux通过无线网卡上网,在Ubuntu中使用PHS无线网卡上网
  18. Python 教程之 Pandas(14)—— 使用 Pandas 进行数据分析
  19. pandas查看数据
  20. unity2D 动态漫画剧本(给猛虎桥章节做动画演示二)

热门文章

  1. jquery的ajax查询数据库,jquery中使用ajax获取远程页面信息
  2. 第 20 次 CSP认证 202009-5 密信与计数
  3. 序列(【CCF】NOI Online能力测试 提高组第一题)
  4. hihocoder第237周:三等分带权树
  5. [转]如果说中国程序员技术偏低,原因可能在这里
  6. 关于我在1024程序员节还在焊板子这件事儿
  7. leetcode939.MinimumAreaRectangle
  8. 【Ionic】Ionic/cmd提示 'node' 不是内部或外部命令,也不是可运行的程序
  9. HashMap遍历有序性问题——map.entrySet()的无序性
  10. Java多线程编程(1)--Java中的线程