/**
* 單基準快排
* 使用 quicksort(arr,0,arr.length-1) 排序整個陣列
*/private static void quicksort(int arr, int left, int right)
return;
} //lt的左邊放小於基準值的值
//gt的右邊放大於基準值的值
//lt與gt其中乙個是基準值
int lt = left, gt = right;
//基準值位置,初始在lt位置
boolean atlt = true;
//從兩側向中心併攏
while (lt < gt)
//基準值在左側,則右側遍歷,否則相反
if (atlt)
--gt;
else
++lt;
} //繼續排序被基準值分隔的兩部分
quicksort(arr, left, lt - 1);
quicksort(arr, gt + 1, right);
}
/**
* 雙基準快排
* 使用 dualpivotquicksort(arr,0,arr.length-1) 排序整個陣列
*/public static void dualpivotquicksort(int arr, int left, int right)
return;
} // left與right分別為左右基準下標(迴圈時不會改變其下標)
// 使[right]>[left]
if (arr[left] > arr[right])
int lt = left + 1; // 小於left的放在lt左邊
int gt = right - 1;// 大於right的放在gt右邊
int i = lt; // 迴圈索引
while (i <= gt) else if (arr[i] > arr[right]) else
} // 將基準交換到位,
swap(arr, left, lt - 1);
swap(arr, right, gt + 1);
// 繼續將被兩個基準值分成的三部分排序
// 此時左基準下標 lt-1 右基準下標 gt+1
dualpivotquicksort(arr, left, lt - 2);
dualpivotquicksort(arr, gt + 2, right);
dualpivotquicksort(arr, lt, gt);
}
Java快速排序以及其優化(雙路快排 三路快排)
快速排序是屬於交換排序的基本思想。選擇乙個基準值val,把比val小的放在前面,比val大的放在後面,最後把val放在兩個區域中間,val就到了最終的位置。很明顯快排是乙個原地排序,也是乙個不穩定排序。空間複雜度 1.可以是為新陣列開闢額外空間o n 2.當然也可以在原陣列內交換得來o 1 時間複雜...
演算法 快速排序 經典快排 隨機快排
經典快排的思路是選取陣列的最後乙個數 x,按照問題一的思路把整個陣列劃分成小於等於 x 大於 x兩個部分,將 x 和 大於 x 部分陣列的第乙個元素交換位置。此時整個陣列劃分成小於等於 x x 大於 x三個部分,也就是這一次排序將 x 值排好位置。再分別對小於等於 x和大於 x中的陣列遞迴劃分,直到...
快速排序和變種快排
快速排序 假設我們現在要對乙個陣列ar進行排序。首先我們需要隨機選擇乙個基準值 一般選陣列的首元素 然後將陣列中的其他值與其進行比較,將小於它的數放在其左側,大於的放在右側 假定按從小到大排序 這就完成了一趟快速排序 原始資料如下 ar 0 ar 1 ar 2 ar 3 ar 4 ar 5 ar 6...