/** * Introduction to Algorithms, Second Edition * 7.1 QUICKSORT * @author 土豆爸爸 * */ public class QuickSort { /** * 对数组array进行排序.解决方案是找到一个位置q * 使q左边的元素都比q小,q右边的元素都比q大,再分 * 别对两侧进行排序. * @param array 待排序数组 * @param p 开始索引 * @param r 结束索引 */ public static void sort(int[] array, int p, int r) { if(p < r) { int q = partition(array, p, r); sort(array, p, q-1); sort(array, q+1, 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 QuickSortTest extends TestCase { public void testFixArray() { int[] array = { 5, 2, 4, 6, 1, 3 }; QuickSort.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); } QuickSort.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; } }
算法导论示例-QuickSort
最新推荐文章于 2024-06-23 11:04:34 发布