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