快速排序
下面的是一个用到的快速排序
/** * 将发生变化 的东西封闭起来 * @author lsj * */ public interface Compare { boolean lessThan (Object lhs ,Object rhs ); boolean lessThanOrEqual(Object lhs , Object rhs ) ; }
再一个文件
import java.util.Vector; /** * 利用回调,经常发生变化的那部分代码会封装到它自己 * 的类内,而总是保持相同的代码则“回调”发生变化的代码。 * * “ 回调”一词的来历:这是由于 quickSort() 方法“往回调用”了 Compare 中的方法。 * 从中亦可理解这种技术如何生成通用的、可重复利用(再生)的代码。 * @author lsj * */ public class SortVector extends Vector{ private Compare compare ;//to hold the callback public SortVector(Compare compare){ this.compare = compare ; } public void sort (){ quickSort( 0, size()-1) ; } private void quickSort (int left , int right ){ if (right> left){ Object o1 = elementAt(right) ; int i = left-1 ; int j = right; while(true){ while( compare.lessThan(elementAt(++i), o1)); while (j > 0) if (compare.lessThanOrEqual(elementAt(--j), o1)) break; if (i >= j) break; swap(i, j); } swap(i, right) ; //递归 ? quickSort(left, i - 1); quickSort(i + 1, right); } } private void swap(int loc1, int loc2) { Object tmp = elementAt(loc1) ; setElementAt(elementAt(loc2), loc1); setElementAt(tmp, loc2) ; } }
最后测试
import java.util.Enumeration; /** * 为使用 SortVector,必须创建一个类,令其为我们准备排序 * 的对象实现 Compare。此时内部类并不显得特别重要,但对于代码的组织却是有益的 * @author lsj * */ public class StringSortTest { static class StringCompare implements Compare{ public boolean lessThan(Object lhs, Object rhs) { return ((String)lhs).toLowerCase().compareTo( ((String)rhs).toLowerCase())<0; } public boolean lessThanOrEqual(Object lhs, Object rhs) { return ((String)lhs).toLowerCase().compareTo( ((String)rhs).toLowerCase()) <= 0; } } public static void main(String [] args ){ SortVector sv = new SortVector(new StringCompare()) ; sv.addElement("d"); sv.addElement("A"); sv.addElement("C"); sv.addElement("c"); sv.addElement("b"); sv.addElement("B"); sv.addElement("D"); sv.addElement("a"); sv.sort() ; Enumeration e = sv.elements() ;//Enumeration是一个接口 while (e.hasMoreElements()) { System.out.println(e.nextElement()) ; } } }