十大排序算法—8. 计数排序

1. 计数排序

计数排序实现原理与示例:
计数排序实现原理与示例

2. 代码实现

public class CountingSort {
    public static void main(String[] args) {
        // 待排序的数组
        int[] arr = new int[]{2, 9, 26, 41, 36, 21, 95, 36, 75, 42, 18};
        int[] newArr = Arrays.copyOf(arr, arr.length);// 拷贝原数组,用新数组排序,不破坏原数组。非必要
        // 排序
        countingSort(newArr);
        System.out.println(Arrays.toString(newArr));
    }

    private static void countingSort(int[] arr) {
        // 找出数组中最大值
        int maxValue = findMaxValue(arr);
        // 建立一个以 arr 中最大值 + 1 为数组长度的数组 bucket
        int[] bucket = new int[maxValue + 1];// 此时 bucket 数组中元素全为 0
        // 遍历 arr,设置 bucket[arr[i]] = bucket[arr[i]] + 1
        for (int temp : arr) {
            bucket[temp] = bucket[temp] + 1;
        }
        // 遍历 bucket,依次将元素值不为 0 的数组索引放入 arr 中,并设置 bucket[i] = bucket[i] - 1
        int index = 0;
        for (int i = 0; i < bucket.length; i++) {
            while (bucket[i] > 0) {
                arr[index++] = i;
                bucket[i] = bucket[i] - 1;
            }
        }
    }

    public static int findMaxValue(int[] arr) {
        int maxValue = 0;
        for (int temp : arr) {
            if (temp > maxValue) {
                maxValue = temp;
            }
        }
        return maxValue;
    }
}

3. 复杂度

时间复杂度:
空间复杂度:

4. 计数排序缺点

  1. 无法对负整数进行排序。arr 中的元素为 bucket 中的索引,索引不能为负,所以 arr 中不能有负整数。
  2. 极其浪费内存空间。最小的元素以下的空间都是浪费。
  3. 当数列最大最小值差距过大时,不适用计数排序。
  4. 计数排序是一个不稳定的排序。

5. 计数排序优化

对于 arr 中最小元素,新建 bucket 后,bucket[minValue(arr)] 都是浪费的,可以在新建 bucket 时,减少这块空间浪费。

原 bucket:

int[] bucket = new int[maxValue + 1];

优化后 bucket:

int[] bucket = new int[maxValue + 1 - minValue];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值