本节中所描述的多态

排序(Sorting)

排序算法可为一个 List 重新排序,以使它的元素按照某种排序关系成上升式排序。有两种形式的操作被提供。简单形式的操作只采用一个 List 并按照它的元素的自然排序进行排序。如果你对自然排序的概念不熟悉,那么应该重新阅读 对象排序(Object Ordering).

sort 操作使用做了些优化的合并排序(merge sort) 算法。如果你不知道它的含义,而又很看重它的话, 请阅读关于算法的任意一种教科书。这个算法的重要之处是:

快速: 这个算法被保证运行在 n log(n) 时间内,并在已基本排序的列表上,它的速度实质上更快。经验表明,它的速度与高度优化的快速排序(quicksort)的速度差不多, Quicksort 一般被认为快于合并排序,但它不稳定,并不保证 n log(n)性能。

稳定: 这就是说,它不为相等的元素重新排序。如果你为相同的列表做不同属性的重复排序,这一点对你来说是十分重要的。如果一个邮件程序的用户为它的邮件箱按日期排序,然后又按发件人排序,这个用户自然地期望某个特定发件人的现在相邻的消息列表将(仍然)按日期排序。这一点只有在第二个排序是稳定的时候才能得以保证。

以下是 一个小程序,它可按词典(字母)顺序打印它的参数:

import java.util.*;

public class Sort {

public static void main(String args[]) {

List l = Arrays.asList(args);

Collections.sort(l);

System.out.println(l);

}

}

让我们运行这个程序:

% java Sort i walk the line

[i, line, the, walk]

演示这个程序只是为了表示我是毫无保留的:这个算法确实是象它们所显现的那样简单。我不想低估你的能力而演示更傻的例子。

第二种形式的 sort除采用一个 List 外,还采用一个 Comparator 并且使用 Comparator 对元素进行排序。还记得在 Map 课程结束时的排列组的例子吗? 它以一个非特定的顺序打印出排列组。假设你要以相反的大小顺序打印它们,大的排列在前面。下列例子将告诉你如何借助 sort 方法的第二种形式而达到你的目的。

java api之算法2

作者:javaman  发表日期:2001-08-06 10:48:15  人气值:51

回想一下,排序表是以 List 对象的形式作为一个 Map 中的值而被存储的。修改后的打印代码通过 Map 的 values视图进行迭代, 将每一个通过最小尺寸测试的List放进List 之中。然后,代码使用一个期望 List 对象的 Comparator 为这个 List 排序,并实现反转大小排序。最终,代码通过现在已排序的 List 进行迭代,打印它的元素(排序组)。这个代码在 Perm 的 main 方法末尾替代了打印代码:

// Make a List of all permutation groups above size threshold

List winners = new ArrayList();

for (Iterator i = m.values().iterator(); i.hasNext(); ) {

List l = (List) i.next();

if (l.size() = minGroupSize)

winners.add(l);

}

// Sort permutation groups according to size

Collections.sort(winners, new Comparator() {

public int compare(Object o1, Object o2) {

return ((List)o2).size() - ((List)o1).size();

}

});

// Print permutation groups

for (Iterator i=winners.iterator(); i.hasNext(); ) {

List l = (List) i.next();

System.out.println(l.size() + ": " + l);

}

用与 Map 课程中使用的相同的词典运行 这个程序 ,并使用相同的最小排序组尺寸(8),会产生下列输出:

% java Perm dictionary.txt 8

12: [apers, apres, asper, pares, parse, pears, prase, presa, rapes,

reaps, spare, spear]

11: [alerts, alters, artels, estral, laster, ratels, salter, slater,

staler, stelar, talers]

10: [least, setal, slate, stale, steal, stela, taels, tales, teals,

tesla]

9: [estrin, inerts, insert, inters, niters, nitres, sinter, triens,

trines]

9: [capers, crapes, escarp, pacers, parsec, recaps, scrape, secpar,

spacer]

9: [anestri, antsier, nastier, ratines, retains, retinas, retsina,

stainer, stearin]

9: [palest, palets, pastel, petals, plates, pleats, septal, staple,

tepals]

8: [carets, cartes, caster, caters, crates, reacts, recast, traces]

8: [ates, east, eats, etas, sate, seat, seta, teas]

8: [arles, earls, lares, laser, lears, rales, reals, seral]

8: [lapse, leaps, pales, peals, pleas, salep, sepal, spale]

8: [aspers, parses, passer, prases, repass, spares, sparse, spears]

8: [earings, erasing, gainers, reagins, regains, reginas, searing,

seringa]

8: [enters, nester, renest, rentes, resent, tenser, ternes, treens]

8: [peris, piers, pries, prise, ripes, speir, spier, spire]

混排(Shuffling)

混排算法所做的正好与 sort 相反: 它打乱在一个 List 中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排该 List, 这样的排列具有相同的可能性(假设随机源是公正的)。这个算法在实现一个碰运气的游戏中是非常有用的。例如,它可被用来混排代表一副牌的 Card 对象的一个 List 。另外,在生成测试案例时,它也是十分有用的。

这个操作有两种形式。第一种只采用一个 List 并使用默认随机源。第二种要求调用者提供一个 Random 对象作为随机源。这个算法的一些实际代码曾在 List 课程中被作为例子使用。

常规数据操作(Routine Data Manipulation)

Collections 类为在 List 对象上的常规数据操作提供了三种算法。这些算法是十分简单明了的:

reverse: 反转在一个列表中的元素的顺序。

fill: 用特定值覆盖在一个 List 中的每一个元素。这个操作对初始化一个 List 是十分有用的。

copy: 用两个参数,一个目标 List 和一个源 List, 将源的元素拷贝到目标,并覆盖它的内容。目标 List 至少与源一样长。如果它更长,则在目标 List 中的剩余元素不受影响。

搜索(Searching)

binary search (二进制搜索)算法用二进制搜索算法在一个已排序的 List 中寻找特定元素。这个算法有两种形式。第一种采用一个 List 和一个要寻找的元素 ( "搜索键(search key)")。这种形式假设 List 是按照它的元素的自然排序排列成上升顺序的。第二种形式除采用 List 外,还采用一个 Comparator 以及搜索键,并假设 List 是按照特定 Comparator 排列成上升顺序的。 排序算法(描述见上) 可优先于 binarySearch 而被用来为List 排序。

两种形式的返回值是相同的: 如果 List 包含搜索键,它的索引将被返回;如果不包括,则返回值为 (-(insertion point) - 1), 这里的 insertion point 被定义为一个点,从这个点该值将被插入到这个 List 中:大于该值的第一个元素的位置索引,或list.size()。 选用这个不可否认的难看的公式是为了保证如果且仅如果搜索键被发现,则返回值将等于0。它基本上是一个将布尔逻辑 ("found") 和整数 ("index") 综合到单一的int返回值的大杂烩。

下列惯用程序对 binarySearch 操作的两种形式均适用,它寻找特定搜索键,如果搜索键不出现,则将它插入到适当的位置:

int pos = Collections.binarySearch(l, key);

if (pos < 0)

l.add(-pos-1, key);

寻找极值(Finding Extreme Values)

min 和 max 算法分别返回包含在特定 Collection 中的最小和最大元素。这两个操作都各有两种形式,简单形式只采用一个 Collection, 并按照元素的自然排序返回最小 (或最大) 元素;另一种形式除采用 Collection 之外,还采用一个 Comparator,并按照特定 Comparator返回最小(或最大)元素。

这些就是由Java 平台提供的作用于与 List 对象相对的任意 Collection 对象上的仅有算法,就象上面提到的 fill 算法一样,这些算法都是非常简单明了的,它们是Java平台为程序员特别提供的便利工具。

ls算法java实现_Java API之算法 | 学步园相关推荐

  1. 基于界面的银行家算法java实现_java实现银行家算法(Swing界面)

    java代码实现了银行家算法,界面写的个人认为还是较为细致的,完整的实现了找安全序列等算法功能,可作为参考学习银行家算法. 直接上代码:①界面展示方法: public void ShowFrame() ...

  2. md5 算法java实现_java实现MD5算法

    import java.security.MessageDigest; /** 加密工具* @author 刘彦青 * **/ public class EncryptUtil { /** MD5加密 ...

  3. java精确度_java的数值精度问题 | 学步园

    1.java的float和double是给科学计算用的,也就是说不能用于商业计算: 2.如果是商业计算那么必需使用java.math.BigDecimal,且必需要使用string来构造: (转载:h ...

  4. java 字长_java数据类型及其字长 | 学步园

    数据类型 大小 范围 默认值 byte(字节) 8 -128 - 127 0 shot(短整型) 16 -32768 - 32768 0 int(整型) 32 -2147483648-21474836 ...

  5. 进程调度rr算法java实现_Java实现进程调度算法(二) RR(时间片轮转)

    一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. 也因为我这次要实现多个类似算法,所以将一些共性单独提取出来作为一个类. 如果只想要和算法有关的核心代 ...

  6. dijkstra算法 java eclipse_数学:Dijkstra算法

    一.最短路径的最优子结构性质 该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径 ...

  7. java 有穷自动机_Java实现雪花算法(snowflake)

    本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...

  8. 高斯模糊java代码_Java实现高斯模糊算法处理图像

    高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop.GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次 ...

  9. java雪花_Java实现雪花算法(snowflake)

    本文主要介绍了Java实现雪花算法(snowflake),分享给大家,具体如下: 简单描述 最高位是符号位,始终为0,不可用. 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一 ...

最新文章

  1. css内边距与外边距的区别
  2. Jmeter添加压力机
  3. android镜像文件怎么命名,android镜像文件说明(示例代码)
  4. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:表格单元格使用了 bg-primary 类...
  5. .NET Core剪裁器升级瘦身引擎,并支持剪裁计划的录制和回放
  6. 一步步编写操作系统 55 CPL和DPL入门2
  7. Python正则表达式re.sub使用
  8. HDU ACM 2647 Reward (topology----拓扑排序)
  9. 进阶版启动jupyterlab教程
  10. 如何用Directshow采集摄像头图像
  11. Android 蓝牙 自动配对连接
  12. 单层感知器python_深度学习之(神经网络)单层感知器(python)(一)
  13. 微云Android2.2apk,微云安卓版V6.2.10
  14. Linux运维(指令全)
  15. Linux下连接mongoDB出现no reachable servers以及mongoDB创建用户
  16. CUMT-CTF第二次双月赛Writeup
  17. OpenStack的产品化历程
  18. 面试之java提高-杨晓峰专栏笔记
  19. WPS 合并一个工作簿中多个工作表
  20. 检测心电信号的p波的matlab代码,matlab心电信号R波检测程序.doc

热门文章

  1. 关于qcom camera cpp driver 的buf分析笔记(msm8996)
  2. 分布图用什么软件制作,公司区域分布图怎么做
  3. xml 硕正报表_主要指标及功能清单
  4. 用瑞利准则研究显微镜物镜的分辨率
  5. (筆記) 如何在字串中從指定字元抓到指定字元? (C/C++) (C)
  6. 图书管理系统需求规格说明文档目录_一个已经超越普通设计素材管理范畴的文档管理软件—Eagle...
  7. Unity Sprite的概念或意义
  8. 《Java-第十一章》之图书管理系统
  9. 原生64位卸载工具Revo Uninstaller Pro V2.5.7
  10. 感受野-Receptive Field的理解