博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法排序之计数排序
阅读量:2193 次
发布时间:2019-05-02

本文共 1684 字,大约阅读时间需要 5 分钟。

计数排序(Counting Sort)

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

1 算法描述

  • 找出待排序的数组中最大和最小的元素;
  • 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
  • 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
  • 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。

2 动图演示

3 代码实现

#include 
#include
#include
void print(int arr[], int len){ for(int i = 0; i < len; ++i) { printf("%d ", arr[i]); }}void countSort(int *array, int size){ int i; int minValue = array[0]; int maxValue = array[0]; int range = 0; int *pTemp = 0; int count = 0; for(i = 0; i < size; i++)//计算数据的分散空间 { if(array[i] < minValue){ minValue = array[i]; } if(array[i] > maxValue) { maxValue = array[i]; } } range = maxValue - minValue + 1; //申请空间并初始化为0, 第一个参数为元素的个数,第二个参数为每个元素所占空间的大小 pTemp = (int*)calloc(range, sizeof(array[0])); if(pTemp == NULL) return; for(i = 0; i < size; ++i)//统计每个元素出现的次数 { int index = array[i] - minValue; pTemp[index]++; } for(i = 0; i < range; ++i)//通过统计pTemp[];回收元素 { while(pTemp[i]--) { array[count++] = i + minValue; } } free(pTemp); pTemp = NULL;}int main(){ int array[10] = {43, 49, 57, 12, 9, 32, 83, 28, 5, 51}; printf("count计数排序前\n"); print(array, 10); printf("\n"); int size = sizeof(array) / sizeof(array[0]); countSort(array, size); printf("count计数排序后\n"); print(array, 10); printf("\n"); printf("Hello World!\n"); return 0;}

4 算法分析

计数排序是一个稳定的排序算法。当输入的元素是 n 个 0到 k 之间的整数时,时间复杂度是O(n+k),空间复杂度也是O(n+k),其排序速度快于任何比较排序算法。当k不是很大并且序列比较集中时,计数排序是一个很有效的排序算法。

参考:

转载地址:http://eziub.baihongyu.com/

你可能感兴趣的文章
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
逆序对的数量(递归+归并思想)
查看>>
数的范围(二分查找上下界)
查看>>
算法导论阅读顺序
查看>>
Windows程序设计:直线绘制
查看>>
linux之CentOS下文件解压方式
查看>>
Django字段的创建并连接MYSQL
查看>>
div标签布局的使用
查看>>
HTML中表格的使用
查看>>
(模板 重要)Tarjan算法解决LCA问题(PAT 1151 LCA in a Binary Tree)
查看>>
(PAT 1154) Vertex Coloring (图的广度优先遍历)
查看>>
(PAT 1115) Counting Nodes in a BST (二叉查找树-统计指定层元素个数)
查看>>
(PAT 1143) Lowest Common Ancestor (二叉查找树的LCA)
查看>>
(PAT 1061) Dating (字符串处理)
查看>>
(PAT 1118) Birds in Forest (并查集)
查看>>