计数排序(桶排序思想)

这段代码是一个计数排序算法的实现。计数排序是一种非比较排序算法,适用于整数数组,其时间复杂度为O(n+k),其中n是数组长度,k是数组中的最大值。以下是该算法的步骤:

首先检查输入数组是否为空或长度小于2,如果是,则直接返回,不进行排序。

遍历数组,找到数组中的最大值。

创建一个大小为最大值加1的桶(bucket)数组,用于存储每个元素出现的次数。

再次遍历数组,将每个元素对应的桶中的计数加1。

最后,遍历桶数组,将桶中的元素按照计数依次放回原数组中。

这段代码实现的计数排序算法的时间复杂度和空间复杂度如下:

时间复杂度

  1. 寻找最大值:遍历整个数组以找到最大值,这一步的时间复杂度是 𝑂(𝑛),其中 n 是数组 arr 的长度。
  2. 填充桶数组:再次遍历数组以填充桶数组,这一步的时间复杂度也是 𝑂(𝑛)。
  3. 生成排序数组:最后,遍历桶数组并构建排序后的数组,这一步的最坏情况时间复杂度是 𝑂(𝑛+𝑘),其中 𝑘 是数组中的最大值,因为需要遍历每个非零的桶。

因此,总的时间复杂度是 𝑂(𝑛+𝑛+𝑛+𝑘)=𝑂(𝑛+𝑘)。

空间复杂度

  1. 桶数组:需要一个额外的数组来作为桶,其大小是输入数组中的最大值加1,即 𝑘+1。因此,空间复杂度是 𝑂(𝑘)。

综上,这段代码的时间复杂度是 𝑂(𝑛+𝑘),空间复杂度是 𝑂(𝑘)。

public class test7 {
    public static void countSort(int[] arr){
        if(arr ==null || arr.length <2){
            return;
        }
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < arr.length; i++) {
            max = Math.max(max , arr[i]);
        }
        int[] bucket = new int[max+1];
        for (int i = 0; i < arr.length; i++) {
            bucket[arr[i]]++;
        }
        int i =0;
        for (int j = 0; j < bucket.length; j++) {
            while (bucket[j]-- > 0){
                arr[i++] = j;
            }
        }
    }
}
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值