排序算法 —— 计数排序

我就是我 2022-10-16 12:29 302阅读 0赞

引言

计数排序是桶排序思想的一种具体实现,针对一些具有特殊限制的样本数据,如公司员工年龄,那么样本数据本身就一定在0~200之间,针对这样的数据,使用从0到200 的桶数组,桶的位置已经是有序的,只需要将对应年龄的数据放入对应的桶,比如,24岁的员工有10人,那么就往 24 号桶中放10个数据。将所有员工年龄数据放入桶数组中后,只需要再次将它们放回到原数组就可以实现排序了:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTQ3NDUwNjk_size_16_color_FFFFFF_t_70

一、代码实现

  1. public static void countSort(int[] arr) {
  2. if (arr == null || arr.length < 2)
  3. return;
  4. // 找到数组中的最大值
  5. int max = Integer.MIN_VALUE;
  6. for (int i = 0; i < arr.length; i++) {
  7. max = Math.max(max, arr[i]);
  8. }
  9. // 为了能够覆盖到最后一个值,需要+1
  10. int[] buckets = new int[max + 1];
  11. // 桶的下标记录数据,桶中的元素记录数据数量
  12. for (int i = 0; i < arr.length; i++) {
  13. buckets[arr[i]]++;
  14. }
  15. int i = 0;
  16. // 循环桶数组
  17. for (int j = 0; j < buckets.length; j++) {
  18. // 如果桶中有元素,那么执行放回操作,并递减,直到取出所有元素
  19. while (buckets[j]-- > 0) {
  20. // 桶下标代表数据本身,因此直接以下标作为返回的数据
  21. arr[i++] = j;
  22. }
  23. }
  24. }

二、计数排序的时间复杂度

计数排序是多个循环操作的累加。

首先是遍历数组,求得一个最大值,来决定桶的个数,时间复杂度是O(N);

然后是将所有元素计数到辅助的桶数组中,时间复杂度是O(N);

随后,通过遍历桶数组,选出存有数据的桶,并依次取出累计个数的元素并返回到原数组中,虽然for循环嵌套了while循环,但实际上while只是把桶中的元素全部取出,其for + while操作的次数一定等于元素个数N,因此时间复杂度同样是O(N)。

所以,最后得出计数排序的时间复杂度是 O(N) + O(N) + O(N) = O(3N) 忽略倍数即为 O(N)。

发表评论

表情:
评论列表 (有 0 条评论,302人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线性排序算法计数排序

    线性排序 时间复杂度是线性的,所以我们把这类排序算法叫作线性排序(Linear sort),桶排序、计数排序、基数排序就是常见的线性排序,之所以能做到线性,他们不是通过比

    相关 排序算法 - 计数排序

    基本思想 计数排序是一种线性排序算法,它利用了一个数组,因为数组下标的增长是线性的,所以它就把自己的元素转换成新开辟数组的下标。可是下标都是非负数啊?数组当中的值有正有负

    相关 排序算法计数排序

    \[非比较排序-计数排序\] 1.算法思想 计数排序要求数据必须是有确定范围的整数,需要定义一个新的数组,新数组的长度是根据原数组最大值和最小值来确定的,该数组用

    相关 排序算法——计数排序

    排序算法——计数排序 > 计数排序是一个非基于比较的排序算法。它的优势在于在对一定范围内的整数排序时,快于任何比较排序算法。 这是一种牺牲空间换取时间的做法,当O(k)>

    相关 线性排序算法-计数排序

    我们前面分析过几种排序算法,时间复杂度为O(![n^\{2\}][n_2])如[冒泡排序,插入排序和选择排序][Link 1]等,时间复杂度为O(nlogn),如[归并排序][

    相关 排序算法 —— 计数排序

    引言 计数排序是桶排序思想的一种具体实现,针对一些具有特殊限制的样本数据,如公司员工年龄,那么样本数据本身就一定在0~200之间,针对这样的数据,使用从0到200 的桶数

    相关 排序算法——计数排序

    前言 计数排序的思想:在给定的数组中,依次寻找比当前数字小的元素的个数(count),统计之后直接使用t就可以定位到该数所在的位置,因为比它小的元素的个数已经通过coun