/** * Introduction to Algorithms, Second Edition * 7.3 RANDOMIZED-QUICKSORT * @author 土豆爸爸 * */ public class RandomizedQuickSort { public static void sort(int[] array, int p, int r) { if (p < r) { int q = randomizedPartition(array, p, r); sort(array, p, q - 1); sort(array, q + 1, r); } } /** * 随机分区,防止出现最坏情况,解决方案是从p到r随机选择一个数与r交换 * * @param array * 待排序数组 * @param p * 待排序数组 * @param r * 开始索引 * @return 位置q */ private static int randomizedPartition(int[] array, int p, int r) { // 产生从p到r的随机数 int i = p + (int) (Math.random() * (r - p + 1)); // 交换a[r],a[i] int temp = array[i]; array[i] = array[r]; array[r] = temp; return partition(array, p, r); } /** * 找到一个位置q,使q左边的元素都比q小,q右边的元素都比q大 * * @param array * 待排序数组 * @param p * 开始索引 * @param r * 结束索引 * @return 位置q */ private static int partition(int[] array, int p, int r) { int x = array[r]; // 取最后一个元素 int i = p - 1; for (int j = p; j < r; j++) { // 所有比x小的元素都交换到前面 if (array[j] <= x) { i++; int temp = array[i]; array[i] = array[j]; array[j] = temp; } } i++; // 将x交换到所有比x小的元素的后面 array[r] = array[i]; array[i] = x; return i; } } import junit.framework.TestCase; public class RandomizedQuickSortTest extends TestCase { public void testFixArray() { int[] array = { 5, 2, 4, 6, 1, 3 }; RandomizedQuickSort.sort(array, 0, array.length - 1); assertTrue(verifyOrdered(array)); } public void testRandomArray() { int size = (int)(Math.random()* 1000); int[] array = new int[size]; for(int i = 0; i < size; i++) { array[i] = (int)(Math.random()* 10000); } RandomizedQuickSort.sort(array, 0, array.length - 1); assertTrue(verifyOrdered(array)); } private boolean verifyOrdered(int[] array) { for (int i = 1; i < array.length; i++) { if (array[i - 1] > array[i]) { return false; } } return true; } }
算法导论示例-RandomizedQuickSort
最新推荐文章于 2023-04-16 00:04:30 发布