📜  算法 - 计数 - Java (1)

📅  最后修改于: 2023-12-03 14:56:43.020000             🧑  作者: Mango

算法-计数-Java

算法简介

计数算法是一种简单而又实用的算法,它的思想是统计每个元素出现的次数,然后根据这些计数值得出有序序列。

算法步骤

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。

  1. 找出待排序的数组中最大和最小的元素;
  2. 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
  3. 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
  4. 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。
Java中的实现

下面是Java代码实现计数排序:

public static void countingSort(int[] arr) {
    if (arr == null || arr.length == 0) {
        return;
    }

    int max = arr[0];
    int min = arr[0];

    for (int i = 1; i < arr.length; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
        if (arr[i] < min) {
            min = arr[i];
        }
    }

    int[] countArr = new int[max - min + 1];
    Arrays.fill(countArr, 0);

    for (int i = 0; i < arr.length; i++) {
        countArr[arr[i] - min]++;
    }

    int j = 0;
    for (int i = 0; i < countArr.length; i++) {
        while (countArr[i] > 0) {
            arr[j] = i + min;
            j++;
            countArr[i]--;
        }
    }
}
算法分析

计数排序是一种稳定的排序算法,在对一些大小范围比较小的整数排序时,它的性能要优于快速排序等基于比较排序的算法。

时间复杂度:O(n + k),其中n是待排序的数组的元素个数,k是待排序的数组的最大值和最小值之差。

空间复杂度:O(n + k)。

总结

计数排序是一种简单而又实用的算法,它适用于待排序的元素在一个比较小的范围内出现的情况,可以在一定程度上优化时间复杂度,是一种必备的排序算法之一。