quickSort
public class QuickSort {
public static void quickSort(int[] arr, int begin, int end) {
if (begin >= end)
return;
int pivotIndex = partition(arr, begin, end);
quickSort(arr, begin, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, end);
}
private static int partition(int[] arr, int begin, int end) {
int pivot = median3(arr, begin, end);
int left = begin;
int right = end - 1;
// partition: [begin + 1,end - 2]
while (left < right) {
while (arr[++left] < pivot) {
}
while (arr[--right] > pivot) {
}
if (left < right)
swap(arr, left, right);
}
swap(arr, end - 1, left);
// return pivotIndex
return left;
}
// 将小中大,依次放在begin、end - 1、end,并返回主元值
private static int median3(int[] arr, int begin, int end) {
int mid = (begin + end) / 2;
if (arr[begin] > arr[mid])
swap(arr, begin, mid);
if (arr[begin] > arr[end])
swap(arr, begin, end);
if (arr[mid] > arr[end])
swap(arr, mid, end);
swap(arr, mid, end - 1);
return arr[end - 1];
}
private static void swap(int[] arr, int left, int right) {
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
public static void main(String[] args) {
int[] arr = { 10, 5, 11, 6, 8, 12, 4, 4, 6 };
quickSort(arr, 0, arr.length - 1);
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + " ");
}
}
}
快排之双向扫描分区
public class 快排之双向扫描分区 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = { 9, 8, 7, 6, 5, 0, 4, 8, 3, 2, 8, 7, 10 };
quickSort(arr, 0, arr.length - 1);
for (int num : arr) {
System.out.print(num + " ");
}
}
private static void quickSort(int[] arr, int begin, int end) {
if (begin >= end) {
return;
}
int indexOfMid = partition(arr, begin, end);
quickSort(arr, begin, indexOfMid - 1);
quickSort(arr, indexOfMid + 1, end);
}
private static int partition(int[] arr, int begin, int end) {
int pivot = arr[begin];
int sp = begin + 1;
int bigger = end;
while (sp <= bigger) {
while (sp <= bigger && arr[sp] <= pivot) {// 遇大停,不能越界
sp++;
}
while (sp <= bigger && arr[bigger] > pivot) {// 遇小停,不能越界
bigger--;
}
if (sp < bigger) {// = 不用加,没有意义,不能越界
swap(arr, sp, bigger);
}
}
swap(arr, begin, bigger);
return bigger;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}