lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1846 随笔 :: 0 文章 :: 109 评论 :: 288万 阅读

计数排序是一种非比较的排序算法,它的时间复杂度是O(n+k),其中n是待排序数组的长度,k是数组中的最大值。计数排序的基本思想是,对于每个输入元素x,确定小于等于x的元素个数,然后把x放在输出数组中对应的位置上。为了实现这个过程,需要一个额外的数组C,用来存储每个元素出现的次数,以及一个累加数组D,用来存储每个元素在输出数组中的位置。计数排序的步骤如下:

  1. 找出待排序数组A中的最大值和最小值,确定数组C和D的长度为k+1,其中k是最大值和最小值的差。
  2. 遍历数组A,对于每个元素A[i],将C[A[i]]加一,表示A[i]出现了一次。
  3. 遍历数组C,对于每个元素C[j],将D[j]赋值为C[0]到C[j-1]的和,表示小于等于j的元素个数。
  4. 反向遍历数组A,对于每个元素A[i],将其放在输出数组B中的第D[A[i]]个位置上,并将D[A[i]]减一,表示该位置已经被占用。
  5. 返回输出数组B作为排序结果。

下面是一个用Java实现的计数排序算法的示例代码:

public class CountingSort {
    public static int[] sort(int[] arr) {
        //找出数组中的最大值和最小值
        int max = arr[0];
        int min = arr[0];
        for (int num : arr) {
            if (num > max) {
                max = num;
            }
            if (num < min) {
                min = num;
            }
        }
        //确定数组C和D的长度
        int k = max - min;
        int[] C = new int[k + 1];
        int[] D = new int[k + 1];
        //统计每个元素出现的次数
        for (int num : arr) {
            C[num - min]++;
        }
        //计算每个元素在输出数组中的位置
        for (int i = 1; i <= k; i++) {
            D[i] = D[i - 1] + C[i - 1];
        }
        //反向填充输出数组
        int[] B = new int[arr.length];
        for (int i = arr.length - 1; i >= 0; i--) {
            B[D[arr[i] - min]] = arr[i];
            D[arr[i] - min]--;
        }
        //返回排序结果
        return B;
    }

    public static void main(String[] args) {
        //测试数据
        int[] arr = {5, 3, 7, 2, 9, 1, 4, 6, 8};
        //打印原始数组
        System.out.println("原始数组:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
        //调用计数排序算法
        arr = sort(arr);
        //打印排序后的数组
        System.out.println("排序后的数组:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}
posted on   白露~  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2018-07-03 java System.arrayCopy使用说明
2018-07-03 list.remove的使用分析
点击右上角即可分享
微信分享提示