您当前的位置: 首页 >  算法

顧棟

暂无认证

  • 5浏览

    0关注

    227博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【重温基础算法】内部排序之计数排序法

顧棟 发布时间:2022-09-21 09:30:02 ,浏览量:5

内部排序之计数排序法

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

主要思想
  1. 计算待排序数组的数据范围(最大值+1)作为计数数组的长度:或者为了降低空间占用量,可以用最大最小的差值+1作为数组长度。例如待排序数据组的最大值是18,最小值是6,那么计数数组的长度就是(18-6+1=13)。
  2. 遍历待排序数组,计算每个元素出现的个数,将结果存放到计数数组,以(元素值-待排序数组最小值)作为下标位置。待排序数组的第1个元素值为4,计算4在待排序数组中出现的次数1,结果存放到计数数组,以(4-1=3)作为下标位置。
  3. 遍历计算数组,从第二个值开始向后进行累加操作,累加规则a[i]=a[i-1]+a[i]。
  4. 反向填充排序数组,遍历待排序数组,获取待排序数据中的每一个元素值,以这个元素值作为下标,获取计数数组中的元素值,这个元素值就是待排数据在已排序数组中的下标位置,排序后对计数数组中的元素值进行-1操作。比如待排序数组的第1个元素值为4,获取计数数组下标为4的元素值为6,那么待排数据4在已排序的数组的下标就是6,在对计数数组进行中6进行-1,此时计数数组下标4的元素值就是5。
过程演示

请添加图片描述

java实现
package sort;

/**
 * 计数排序
 */
public class CountingSort {
    public static void main(String[] args) {
        int[] o = {7, 6, 9, 3, 1, 5, 2, 4, 8};
        System.out.print("排序前: ");
        for (int t : o) {
            System.out.print(t);
            System.out.print(" ");
        }
        System.out.println();

        // 算法部分
        int maxValue = getMaxValue(o);
        int bucketLen = maxValue + 1;
        int[] bucket = new int[bucketLen];

        for (int value : o) {
            bucket[value]++;
        }

        int sortedIndex = 0;
        for (int j = 0; j  0) {
                o[sortedIndex++] = j;
                bucket[j]--;
            }
        }

        System.out.print("排序后: ");
        for (int t : o) {
            System.out.print(t);
            System.out.print(" ");
        }
        System.out.println();

    }

    private static int getMaxValue(int[] arr) {
        int maxValue = arr[0];
        for (int value : arr) {
            if (maxValue             
关注
打赏
1663402667
查看更多评论
0.0428s