快速排序

下面的是一个用到的快速排序

/**
 * 将发生变化 的东西封闭起来
 * @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()) ;
		}
	}
}

  

 

原文地址:https://www.cnblogs.com/chuiyuan/p/4338297.html