快速排序(java實現)
阿新 • • 發佈:2018-10-30
oid 快速排序 main 優化 尋找 隨機 [] 位置 優化策略
一,算法思想:
要實現快速排序,一般策略是先隨意的選取a[left]作為切分的基準元素,通俗來講就是標誌元素,
往後循環都和這個標誌元素進行比較。然後我們循環從數組的右端開始往左端循環找尋小於切分元素的元素a[j],再從左
端向右端尋找大於切分元素的元素a[i],使此時的a[i]和a[j]交換,再重復進行找尋,交換。當i位置和j位置重合時,即左端指針和右端指針相遇時,
一輪尋找到此結束。此時,把切分元素填入i==j的位置(填坑法),基於切分元素實現數組一切為二。再遞歸調用左半邊和右半邊。當遞歸中發現left>=right
此時即為遞歸出口,元素已經全部有序。
二,代碼:
/**
* 快速排序 不穩定
*平均情況O(nlog2n) 最好情況O(nlog2n) 最壞情況O(n*n) 輔助空間O(nlog2n)
**/
public class Qsort {
public static void main(String[] args) {
int[] a = {1, 2, 3, 5, 2, 0, 4, 9}; //測試數組
qso(a, 0, a.length - 1); //調用快速排序
for (int k : a) { //叠代輸出數組
System.out.print(k+" ");
}
}
private static void qso(int a[], int left, int right) {
int i;
int j;
int t;
if (left >= right) return;//遞歸調用中,若left>=right,說明達到遞歸出口,元素已經全部有序
int temp = a[left];//定義a[left]為切分的基準元素(可優化為隨機選取基準元素,消除數據依賴)
i = left;
j = right;
while (i != j) {
while (a[j] >= temp && i < j) j--;//從右往左找到需要交換的a[j]位置
while (a[i] <= temp && i < j) i++;//從左往右找到需要交換的a[i]位置
if (i < j) { // 滿足i<j,交換a[i]和a[j]兩個位置
t = a[i];
a[i] = a[j];
a[j] = t;
}
}//若跳出循環,證明i和j相遇
//此時,需要將基準數tem歸位到i==j的那個位置
a[left] = a[i];
a[i] = temp;
//將已經歸為的左邊和右邊的數,再次遞歸調用快速排序
qso(a,left,i-1);
qso(a,i+1,right);
}
}
三,優化策略
*可優化1 打亂數組,達到隨機選擇基準元素的作用
*可優化2 判斷長度,當數組長度較小時,直接調用插入排序算法,效率更高
*可優化3 三取樣切分等
快速排序(java實現)