package mz.ds.sort;
import java.util.List;
/**
* 快速排序算法
*/
public class QuikSort <T extends Comparable<T>>{
/**
* 待排序集合
*/
private List<T> list;
public QuikSort(List<T> list) {
this.list =list;
}
public List<T> quiksort() {
if (list == null || list.size() ==0) {
return null;
}
_quiksort(0, list.size()-1);
return list;
}
/**
* 快速排序算法
* @param low
* @param high
*/
private void _quiksort(int low, int high) {
if (low < high) {
// 整理对象集合,并获取枢轴 的位置
int pivot =_partition(low, high);
// 整理左边
_quiksort(low, pivot-1);
// 整理右边
_quiksort(pivot+1, high);
}
}
/**
* 将要排序的集合一分为二,
* 默认枢轴的大小为low位置上的对象
*
* @param low 低位置
* @param high 高位置
* @return 枢轴位置
*/
private int _partition(int low, int high) {
// 枢轴 暂时设定就取第一个对象
T pivotObj =list.get(low);
// 从表两端交替扫描
while(low < high) {
// 从尾部向头部扫描
while (low < high && list.get(high).compareTo(pivotObj) >=0) {
--high;
}
// 将扫描到的小于枢轴的对象放到枢轴处
list.set(low, list.get(high));
// 从头部向尾部扫描
while (low < high && list.get(low).compareTo(pivotObj) <=0) {
++low;
}
// 将扫描到的大于枢轴的对象放到尾部
list.set(high, list.get(low));
}
list.set(low, pivotObj);
return low;
}
}
试一下:
package mz.ds.sort;
import java.util.ArrayList;
import java.util.List;
public class TestMain {
public static void main(String[] args) {
List<Integer> list =new ArrayList<Integer>();
// 初始化 要排序的集合,默认10个100以内的整数
for (int i=0; i< 50; ++i) {
list.add((int)(Math.random()*100));
}
printList(list);
// 测试快速排序
QuikSort<Integer> sort =new QuikSort<Integer>(list);
List<Integer> slist =sort.quiksort();
printList(slist);
}
public static void printList(List<Integer> list) {
for (int i=0; i<list.size(); ++i) {
System.out.print(list.get(i) +"\t");
if ((i+1)%10 ==0) {
System.out.println();
}
}
System.out.println();
}
}
输出结果:
45 86 75 99 78 41 96 0 26 0
77 81 39 5 61 44 75 98 39 73
71 11 66 68 17 50 71 94 43 25
94 11 75 52 26 37 72 89 97 45
81 92 33 56 35 57 56 9 43 3
0 0 3 5 9 11 11 17 25 26
26 33 35 37 39 39 41 43 43 44
45 45 50 52 56 56 57 61 66 68
71 71 72 73 75 75 75 77 78 81
81 86 89 92 94 94 96 97 98 99