* 快速排序列表中的元素,List中的元素必須實現了Comparable接口
*
* @param list
* 列表
* @param fromIndex
* 左索引(排序開始索引)
* @param toIndex
* 右索引(排序結束結束索引)
* @throws Exception
*/
public static void quickSortList(List<Comparable> list, int fromIndex, int toIndex)
throws Exception {
int tempFromIndex = fromIndex; // 左索引
int tempToIndex = toIndex; // 右索引
Comparable midElement; // 分割元素
Comparable tempElement; // 臨時變量,存儲所取的列表中的元素
if (toIndex > fromIndex) {
/*
* 取列表中間索引的值的對象作爲分割元素
*/
midElement = (Comparable) list.get((fromIndex + toIndex) / 2);
// 循環列表直到索引交叉
while (tempFromIndex <= tempToIndex) {
/*
* 從左索引方向開始找到第一個大於或等於分割元素的元素
*/
while (tempFromIndex < toIndex) {
tempElement = (Comparable) list.get(tempFromIndex);
if (tempElement.compareTo(midElement) < 0)
++tempFromIndex;
else
break;
}
/*
* 從右索引方向開始找到第一個小於或等於分割元素的的元素
*/
while (tempToIndex > fromIndex) {
tempElement = (Comparable) list.get(tempToIndex);
if (tempElement.compareTo(midElement) > 0)
--tempToIndex;
else
break;
}
// 如果索引沒有交叉則交換兩個對象位置
if (tempFromIndex <= tempToIndex) {
swap(list, tempFromIndex, tempToIndex);
++tempFromIndex;
--tempToIndex;
}
}
/*
* 如果右索引沒有到達左索引,則排序左邊區域
*/
if (fromIndex < tempToIndex)
quickSortList(list, fromIndex, tempToIndex);
/*
*
* 如果左索引沒有到達右索引,則排序右邊區域
*/
if (tempFromIndex < toIndex)
quickSortList(list, tempFromIndex, toIndex);
}
}
/**
* 交換列表中的兩個位置的對象
*
* @param list
* 列表
* @param i
* 索引
* @param j
* 索引
*/
private static void swap(List list, int i, int j) {
Object io = list.get(i);
Object jo = list.get(j);
list.remove(i);
list.add(i, jo);
list.remove(j);
list.add(j, io);
}