/**
* 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 发布
1105

被折叠的 条评论
为什么被折叠?



