演算法
本節中所描述的多態演算法 (polymorphic algorithms)是由 JDK 所提供的可重複使用的功能性片段。它們均取自Collections類,並都採用靜態方法(它的第一個參數是執行操作的 對象集)的形式。由Java平台所提供的絕大多數演算法都操作於List對象,但有兩個 (min 和 max) 操作於任意Collection對象。以下是關於演算法的描述
排序(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 方法的第二種形式而達到你的目的。