魔术桌
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • Algorithm - 排序 - 计数排序

文章摘要: 计数排序是一种非比较型整数排序算法。

简介

简要说明

  • 计数排序是一种非比较型整数排序算法。
  • 使用一个额外的数组来计算每个元素的出现次数,然后根据计数数组来将元素放到正确的位置。计数排序适用于小范围整数的排序。

主要功能

  • 对整数进行排序,特别是当整数范围不大时。
  • 通过计数每个元素的出现次数,确定每个元素在排序后数组中的位置。

注意事项

  • 计数排序只适用于非负整数排序。
  • 如果要排序的数据范围很大,计数排序的空间复杂度会非常高。
  • 计数排序不是比较排序,因此其时间复杂度不受输入数据分布的影响。

适用场景

  • 数据范围较小,即最大值和最小值的差值不是很大。
  • 数据量较大,但可以接受额外的空间开销。

时间复杂度

  • 平均情况:O(n + k),其中n是待排序元素的数量,k是最大元素值与最小元素值的差。

空间复杂度

  • O(n + k),其中n是待排序元素的数量,k是最大元素值与最小元素值的差。

Java 8

public class CountingSort {

    // 主方法调用计数排序
    public static void main(String[] args) {
        int[] array = {4, 2, 2, 8, 3, 3, 1};
        System.out.println("Original array: " + Arrays.toString(array));

        countingSort(array);

        System.out.println("Sorted array: " + Arrays.toString(array));
    }

    // 计数排序方法
    public static void countingSort(int[] array) {
        // 找到数组中的最大值
        int max = Arrays.stream(array).max().getAsInt();
        
        // 创建计数数组,大小为max+1
        int[] count = new int[max + 1];
        
        // 计算每个元素的出现次数
        for (int number : array) {
            count[number]++;
        }
        
        // 修改计数数组,每个位置存储小于等于该值的元素个数
        for (int i = 1; i < count.length; i++) {
            count[i] += count[i - 1];
        }
        
        // 构建输出数组
        int[] output = new int[array.length];
        for (int i = array.length - 1; i >= 0; i--) {
            output[count[array[i]] - 1] = array[i]; // 放置元素
            count[array[i]]--; // 减少计数
        }
        
        // 将排序好的数组复制回原数组
        System.arraycopy(output, 0, array, 0, array.length);
    }
}

注释

在这个Java案例中,countingSort 方法实现了计数排序算法。首先,它找到数组中的最大值以确定计数数组的大小。然后,它计算每个元素的出现次数,并修改计数数组以存储小于等于每个值的元素个数。最后,它构建输出数组,并将排序好的数组复制回原数组。

更新时间: 2025/10/3 17:56