排序算法 - 计数排序

柔光的暖阳◎ 2023-08-17 16:43 134阅读 0赞

基本思想

计数排序是一种线性排序算法,它利用了一个数组,因为数组下标的增长是线性的,所以它就把自己的元素转换成新开辟数组的下标。可是下标都是非负数啊?数组当中的值有正有负啊。做一个简单的转化就行了:找到数组中最小元素,用元素值减去,这样一来,所有元素对应的下标就求出来了。(实际上感觉像是个映射函数?)下图中保存的是待排序数组:[-1,-5,-6,-2,1,2,8,2,1,8]

1475571-20190815222221988-794651078.png

然后跟哈希排序的思路一样:这里。直接开辟一个对应的哈希数组,然后统计每个元素出现的次数。橙色标注出来的表示待排序数组中没有的元素(转换后的元素),自然就没有出现次数。这样可以看出来如果数组中元素差距很大,其实还是很浪费空间的,因为它新开辟数组的大小是待排序数组arr中max-min+1(8+6+1=15)。

1475571-20190815222306673-932627829.png

最后再将count中的元素放回到arr中,就完成排序了。

算法代码

  1. 1 //计数排序
  2. 2 void CountSort(int *a, int size)
  3. 3 {
  4. 4 int max = a[0];
  5. 5 int min = a[0];
  6. 6 for (int i = 0; i < size; ++i)
  7. 7 {
  8. 8 if (a[i] > max)
  9. 9 max = a[i];
  10. 10 if (a[i] < min)
  11. 11 min = a[i];
  12. 12 }
  13. 13 int range = max - min + 1; //要开辟的数组范围
  14. 14 int *count = new int[range];
  15. 15 memset(count, 0, sizeof(int) * range); //初始化为0
  16. 16 //统计每个数出现的次数
  17. 17 for (int i = 0; i < size; ++i) //从原数组中取数,原数组个数为size
  18. 18 {
  19. 19 count[a[i] - min]++;
  20. 20 }
  21. 21 //写回到原数组
  22. 22 int index = 0;
  23. 23 for (int i = 0; i < range; ++i) //从开辟的数组中读取,开辟的数组大小为range
  24. 24 {
  25. 25 while (count[i]--)
  26. 26 {
  27. 27 a[index++] = i + min;
  28. 28 }
  29. 29 }
  30. 30 delete[] count;
  31. 31 }

算法分析

计数排序是一种非基于比较的排序算法,其空间复杂度和时间复杂度均为 O(n+k),其中 k 是整数的范围。

[参考:https://blog.csdn.net/qq\_34269988/article/details/90705977\]

转载于:https://www.cnblogs.com/WindSun/p/11361008.html

发表评论

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

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

相关阅读

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

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

    相关 排序算法 - 计数排序

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

    相关 排序算法计数排序

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

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

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

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

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

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

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

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

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