Java 实现
package com.littlefxc.examples.algorithm;
public class QuickSort {
private QuickSort() {
}
public static void sort(Comparable[] arr) {
sort(arr, 0, arr.length - 1);
}
private static void sort(Comparable[] arr, int p, int r) {
if (r - p <= 15) {
InsertionSort.insertionSort(arr, p, r);
return;
}
int q = partition3(arr, p, r);
sort(arr, p, q - 1);
sort(arr, q + 1, r);
}
private static int partition1(Comparable[] arr, int p, int r) {
Comparable key = arr[r];
int i = p;
for (int j = i; j < r; j++) {
if (arr[j].compareTo(key) <= 0) {
swap(arr, i++, j);
}
}
swap(arr, i, r);
return i;
}
private static int partition2(Comparable[] arr, int p, int r) {
swap(arr, p, (int) (Math.random() * (r - p + 1)) + p);
Comparable key = arr[p];
int i = p;
for (int j = p + 1; j <= r; j++) {
if (arr[j].compareTo(key) < 0) {
swap(arr, j, ++i);
}
}
swap(arr, p, i);
return i;
}
private static int partition3(Comparable[] arr, int p, int r) {
swap(arr, p, (int) (Math.random() * (r - p + 1)) + p);
Comparable key = arr[p];
int i = p + 1, j = r;
while (true) {
while (i <= r && arr[i].compareTo(key) < 0) {
i++;
}
while (j >= i + 1 && arr[j].compareTo(key) > 0) {
j--;
}
if (i > j) {
break;
}
swap(arr, i++, j--);
}
swap(arr, p, j);
return j;
}
private static void swap(Object[] arr, int i, int j) {
Object objTmp = arr[i];
arr[i] = arr[j];
arr[j] = objTmp;
}
}
测试
package com.littlefxc.examples.algorithm;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.*;
public class QuickSortTest {
@Test
public void sort() {
int N = 10000000;
Integer[] arr1 = SortTestHelper.generateRandomArray(N, 0, N);
Integer[] arr2 = Arrays.copyOf(arr1, arr1.length);
SortTestHelper.testSort("com.littlefxc.examples.algorithm.MergeSort", "sort", arr1);
SortTestHelper.testSort("com.littlefxc.examples.algorithm.QuickSort", "sort", arr2);
}
@Test
public void sortNearlyOrderedArray() {
int N = 10000000;
Integer[] arr1 = SortTestHelper.generateNearlyOrderedArray(N, 1);
Integer[] arr2 = Arrays.copyOf(arr1, arr1.length);
SortTestHelper.testSort("com.littlefxc.examples.algorithm.QuickSort", "sort", arr1);
SortTestHelper.testSort("com.littlefxc.examples.algorithm.MergeSort", "sort", arr2);
}
@Test
public void sort3() {
int N = 1000000;
Integer[] arr1 = SortTestHelper.generateRandomArray(N, 0, 10);
Integer[] arr2 = Arrays.copyOf(arr1, arr1.length);
SortTestHelper.testSort("com.littlefxc.examples.algorithm.MergeSort", "sort", arr1);
SortTestHelper.testSort("com.littlefxc.examples.algorithm.QuickSort", "sort", arr2);
}
}