Java排序算快速排序_Java排序算法 [快速排序]
package cn.com.dom4j.sort;
public class QuickSort {
/**
快速排序
在 Java中, 快速排序被用作基本數據類型的排序 (當然, 不只快速排序一種)
快速排序是實踐中的一種快速的排序算法, 在 C++或對 Java基本類型的排序證特別有用.
它的平均運行時間是 O(N logN), 該算法之所以特別快, 主要是由于非常精煉和高度優(yōu)化的內部循環(huán).
它的最壞情形性能為 O(N^2), 但經過稍許努力可是這種情形極難出現.
通過將快速排序和堆排序結合, 由于堆排序的 O(N logN)最壞情形運行時間, 我們可以對幾乎所有的輸入都能達到快速排序的快速運行時間
*/
public static > void quickSort(AnyType[] a) {
quickSort(a, 0, a.length - 1);
}
/**
* 快速排序主例程
*
* @param a 原始數組
* @param left 起始索引
* @param right 結束索引
* @param 實現了 Comparable接口的類或其子類
*/
private static > void quickSort(AnyType[] a, int left, int right) {
// 定義數組大小邊界, 小于這個值時使用插入排序
int CUTOFF = 10;
// 數組元素較少的時候, 使用插入排序來獲取更快的速度; 元素較多時, 使用快排
if (left + CUTOFF <= right) {
// 三數中值分割法產生樞紐元
AnyType pivot = median3(a, left, right);
// i: 比樞紐元小的元素起始索引; j: 大元素的起始索引
int i = left, j = right - 1;
for ( ; ; ) {
// 小元素指針不斷向右推進, 直到找到比樞紐元大的元素
while (a[++i].compareTo(pivot) < 0) {
}
// 大元素指針向左推進, 遇到比樞紐元小的元素終止
while (a[--j].compareTo(pivot) > 0) {
}
// 兩個索引未交叉時, 代表大小序列還未分割完成, 交換位置后繼續(xù)分割
// 交叉時代表分割完成
if (i < j)
swap(a, i, j);
else
break;
}
// 分割完成后, 將樞紐元和小元素索引終止處的元素位置互換
// 此時, 樞紐元左側都為小元素, 右側都為大元素 (相對于樞紐元而言)
swap(a, i, right - 1);
// 對分割后的子序列重復上面操作
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
} else {
insertionSort(a, left, right);
}
}
/**
* 對數組的指定部分使用插入排序
* @param a 原始數組
* @param left 起始索引
* @param right 結束索引
* @param 實現了 Comparable接口的類型或其子類
*/
private static > void insertionSort(AnyType[] a, int left, int right) {
if (right - left == 0 || left < 0 || right > a.length - 1) {
return;
}
AnyType tmp;
int j;
for (int i = left + 1; i <= right; i++) {
tmp = a[i];
for (j = i; j > left && tmp.compareTo(a[j - 1]) < 0; j--) {
a[j] = a[j - 1];
}
a[j] = tmp;
}
}
/**
三數中值分割法
使用左端, 右端和中心位置上的三個元素的中值作為樞紐元
*/
private static > AnyType median3(AnyType[] a, int left, int right) {
int center = (right - left) / 2;
// 對左中右三個位置的元素位置進行調整
// 最小的元素被放在最左端, 最大的元素放在最右端, 中間的元素放在中間位置, 中間元素要作為樞紐元
if (a[center].compareTo(a[left]) < 0) {
swap(a, left, center);
}
if (a[right].compareTo(a[left]) < 0) {
swap(a, left, right);
}
if (a[right].compareTo(a[center]) < 0) {
swap(a, center, right);
}
// 將樞紐元和右端倒數第二個元素交換位置, 使樞紐元離開數組, 便于元素比較
swap(a, center, right - 1);
// 將樞紐元返回
return a[right - 1];
}
/**
* 交換數組中兩個元素的位置
*/
private static > void swap(AnyType[] arr, int i, int j) {
if (arr == null || arr.length <= 1 || i == j) {
return;
}
AnyType tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
總結
以上是生活随笔為你收集整理的Java排序算快速排序_Java排序算法 [快速排序]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《楚乔传》长安七俊有七种不同的结局 最惨
- 下一篇: jmeter找不到java.dll_Wi