计数排序(java实现)

       计数排序是一个非基于比较的线性时间排序算法,是一种稳定排序的算法。它的基本思想是对于给定的输入序列中的每一个元素 x,确定该序列中值小于 x 的元素的个数。一旦确定了这一信息,就可以将 x 直接存放到最终的输出序列的正确位置上。例如,如果输入序列中只有 9 个元素的值小于 x 的值,则 x 可以直接存放在输出序列的第 10 个位置上。当然,如果有多个元素具有相同的值时,我们不能将这些相同的元素放在输出序列的同一个位置上,因此还需对上述方案作适当的修改。
       计数排序的步骤如下:

  1. 统计数组A中每个值A[i]出现的次数,存入C[A[i]];
  2. 从前向后,使数组C中的每个值等于其与前一项相加,C[A[i]]代表数组A中有多少个小于等于A[i]的元素;
  3. 反向填充目标数组B:将数组元素A[i]放在数组B的第C[A[i]]个位置(下标为C[A[i]] – 1),每放一个元素就将C[A[i]]递减。

在实现计数排序的过程中,我们需要两个辅助数组:B[0…n-1]存放排序结果,C[0…k-1]作为临时数组。(k为数组A中的最大值与最小值的极值差+1)

       举个例子,以数组A = {4,,5,0,3,1,5,0,5}进行排序。流程如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
计数排序by zjb
代码:

public static int[] CountingSort(int[] a) {
    int b[] = new int[a.length];
    int max = a[0], min = a[0];
    for (int i=1;i<a.length;i++) {
        if (a[i] > max) {
            max = a[i];
        }
        if (a[i] < min) {
        min = a[i];
        }
    } 
    // k的大小是要排序的数组中,元素大小的极值差+1
    int k = max - min + 1;
    int c[] = new int[k];
    //统计A数组元素出现次数
    for (int i = 0; i < a.length; ++i) {
        c[a[i] - min] += 1;
    }
    //更新计算C数组
    for (int i = 1; i < c.length; ++i) {
        c[i] = c[i] + c[i - 1];
    }
    //填充B数组
    for (int i = a.length - 1; i >= 0; --i) {
        b[--c[a[i] - min]] = a[i];
    }
    return b;
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
桶排序和计数排序是两种不同的排序算法。 桶排序的基本思想是将数组分到有限数量的桶里,再对每个桶中的元素进行排序,最后按照桶的顺序将元素依次列出来,形成有序序列。桶排序的时间复杂度取决于对每个非空桶进行排序时所选择的排序算法。当要排序的数据均匀分布时,桶排序可以达到线性时间复杂度。 计数排序是一种记录数据出现次数的排序算法。它的原理类似于桶排序,可以看作是一种特殊的桶排序算法计数排序遍历序列,并将每个元素放入对应的桶中。然后按照桶的顺序将元素依次放回原来的序列中。计数排序是一种稳定的排序算法,适用于数据范围较小的情况。 对于Java语言,你可以使用以下代码实现桶排序和计数排序: 桶排序的Java实现代码示例: ``` public void bucketSort(int[] arr, int bucketSize) { if (arr.length == 0) { return; } // 寻找数组的最大值和最小值 int min = arr[0], max = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] < min) { min = arr[i]; } else if (arr[i] > max) { max = arr[i]; } } // 桶的数量 int bucketCount = (max - min) / bucketSize + 1; List<List<Integer>> buckets = new ArrayList<>(); for (int i = 0; i < bucketCount; i++) { buckets.add(new ArrayList<>()); } // 将数组中的元素放入对应的桶中 for (int i = 0; i < arr.length; i++) { int bucketIndex = (arr[i] - min) / bucketSize; buckets.get(bucketIndex).add(arr[i]); } // 对每个桶中的元素进行排序,并放回原来的序列中 int index = 0; for (int i = 0; i < bucketCount; i++) { List<Integer> bucket = buckets.get(i); Collections.sort(bucket); for (int j = 0; j < bucket.size(); j++) { arr[index++] = bucket.get(j); } } } ``` 计数排序Java实现代码示例: ``` public void countingSort(int[] arr) { if (arr.length == 0) { return; } // 寻找数组的最大值和最小值 int min = arr[0], max = arr[0]; for (int i = 1; i < arr.length; i++) { if (arr[i] < min) { min = arr[i]; } else if (arr[i] > max) { max = arr[i]; } } // 计算数组中每个元素的出现次数 int[] counts = new int[max - min + 1]; for (int i = 0; i < arr.length; i++) { counts[arr[i] - min]++; } // 将计数数组中的元素依次放回原来的序列中 int index = 0; for (int i = 0; i < counts.length; i++) { while (counts[i] > 0) { arr[index++] = i + min; counts[i]--; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃鱼的ねこ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值