日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java排序算快速排序_Java排序算法 [快速排序]

發(fā)布時間:2023/12/1 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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排序算法 [快速排序]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。