算法导论示例-CountingSort

原创 2006年06月06日 01:01:00
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;
    }
}

链式哈希表(Hash Table)--算法导论示例

In computer science, a hash table is an associative array data structure that associates keys with v...

算法导论课后习题解析 第四章 上

算法导论课后习题解析 第四章 上 4.1-1 返回只包含绝对值最小的元素的子数组。   4.1-2 1 2 3 ...

<算法导论>第八章4 水壶(Kettle)

8-4  水壶    假设给定了n个红色的水壶和n个蓝色的水壶,它们的形状和尺寸都不相同。所有红色水壶中所盛水的量都不一样,蓝色水壶也是一样。此外,对于每个红色的水壶,都有一个对应的蓝色水壶,两者所...

算法导论------ShellSort希尔排序

目录 1.Shellsort的思想 2.代码实现 3.增量序列 4.算法分析 5.参考资料   Shellsort是最古老的排序算法之一,该算法以其发明者Donald L. Shell的名字命名(19...

【算法导论】动态规划之“钢管切割”问题

动态规划,其实跟分治法有些相似,基本思想都是将复杂的问题分成数个简单的子问题,然后再去解决。它们的区别在于,分治法关注的子问题不相互“重叠”,而动态规划关注的子问题,多是相互“重叠”的。...

《算法导论(原书第3版)》pdf

下载地址:网盘下载 内容简介  · · · · · · 在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将...

《算法导论》的基数排序 C++实现

#include #include using namespace std; typedef struct Node{ int data; //数值 int ge; //位值 int ...

算法导论9.3-8-设X[1..n]和Y[1..n]为两个数组,每个都包含n个已排好序的数,给出一个求数组X和数组Y中所有2n个元素的中位数

#include #include #include #include using namespace boost::timer; using namespace std; int part...

算法导论 习题15.4-5 15.4-6 找出一个n个数的序列中最长的单调递增子序列

算法导论15.4-5 请给出一个O(n^2)时间的算法,使之能找出一个n个数的序列中最长的单调递增子序列。 这个题目是在动态规划部分,此处显然是要用到动态规划。 我们知道可以使用动态规划思想的问题的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论示例-CountingSort
举报原因:
原因补充:

(最多只允许输入30个字)