public class CountingSort { /** * 计数排序. * @param array 待排序数组 * @param k 数组元素范围为0-k * @return 已排序数组 */ public static int[] sort(int[] array, int k) { int[] counts = new int[k+1]; // 统计元素出现的次数 for (int i = 0; i < array.length; i++) { counts[array[i]]++; } // 合计,每个元素是前面所有元素的和 for (int i = 1; i < counts.length; i++) { counts[i] += counts[i - 1]; } int[] result = new int[array.length]; // 复制,array[i]在目标数组中的位置是counts[array[i] for (int i = array.length - 1; i >= 0; i--) { result[counts[array[i]]-1] = array[i]; counts[array[i]]--; } return result; } } import junit.framework.TestCase; public class CountingSortTest extends TestCase { public void testFixArray() { int[] array = { 0, 2, 4, 3, 1, 3 }; array = CountingSort.sort(array, 4); 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()* 100); } array = CountingSort.sort(array, 100); 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; } }
算法导论示例-CountingSort
最新推荐文章于 2024-09-12 16:28:29 发布