"图像识别笔记2022.31与基础排序的计数排序算法实现"
图像识别笔记2022.31 编程基础 1.1 基础排序 1.1.1 计数排序 计数排序是一种基于计数的排序算法,它的思路如下:首先计算一个数组的元素名次,然后使用一个临时数组按照名次排名依次放入对应的原数组元素,再把这个临时数组按顺序赋值给原数组进行覆盖即可。这个算法的时间复杂度分析如下:比较的次数为 n(n-1)/2,原数组到临时数组的赋值次数为 n,临时数组到原数组的赋值次数为 n,所以总的时间复杂度为 2n + n(n-1)/2。 名次的计算规则是:一个序列中某个元素的名次等于所有比它小的元素个数总数加上它左边与它相同的元素个数。换句话说,除了要考虑比别人大,还要考虑与相同大小元素的相对名次。例如,对于数组[4,3,9,3,7],4比其它元素都大,所以名次为2,7比4小,但大于3,所以名次为3,9比4和7都小,所以名次为4,而两个3大小相等但出现次序不同,所以第一个3名次靠后为0,第二个3名次靠前为1,最终返回值为[2,0,4,1,3]。 1.1.1.1 C语言实现 1.1.1.1.1 常规实现 常规的计数排序实现需要使用临时数组,代码如下所示: ```C++ template<class T> void count_sort(T a[], int n, bool reverse, bool show){ // 找到数组中的最大值和最小值 T max_val = a[0], min_val = a[0]; for(int i=1; i<n; i++){ if(a[i] > max_val) max_val = a[i]; if(a[i] < min_val) min_val = a[i]; } // 根据最大值和最小值创建计数数组,并将所有元素初始化为0 int count_size = max_val - min_val + 1; int* count = new int[count_size](); // 计算每个元素的频次 for(int i=0; i<n; i++){ count[a[i] - min_val]++; } // 根据排序顺序确定累计频次 if(reverse){ for(int i=count_size-2; i>=0; i--){ count[i] += count[i+1]; } } else{ for(int i=1; i<count_size; i++){ count[i] += count[i-1]; } } // 将元素按顺序放入临时数组 T* temp = new T[n]; for(int i=n-1; i>=0; i--){ temp[--count[a[i] - min_val]] = a[i]; } // 将临时数组的元素覆盖原数组 for(int i=0; i<n; i++){ a[i] = temp[i]; } // 输出排序结果 if(show){ for(int i=0; i<n; i++){ cout << a[i] << " "; } cout << endl; } // 释放动态分配的内存 delete[] count; delete[] temp; } ``` 以上代码中,首先找到数组中的最大值和最小值,然后根据最大值和最小值创建计数数组,并将所有元素初始化为0。接着遍历原数组,计算每个元素的频次。然后根据排序顺序确定累计频次,这里的排序顺序可以通过`reverse`参数进行控制。最后,将元素按顺序放入临时数组,并将临时数组的元素覆盖原数组。算法的最后输出了排序结果,可以通过`show`参数进行控制是否显示。 这样,我们就完成了基于计数的排序算法的C语言实现。通过调用上述的`count_sort`函数,我们可以对任意类型的数组进行排序。该算法具有O(n)的时间复杂度,适合用于解决数据量较大但取值范围较小的问题。
剩余140页未读,继续阅读
- 粉丝: 20
- 资源: 350
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- zlib-1.2.12压缩包解析与技术要点
- 微信小程序滑动选项卡源码模版发布
- Unity虚拟人物唇同步插件Oculus Lipsync介绍
- Nginx 1.18.0版本WinSW自动安装与管理指南
- Java Swing和JDBC实现的ATM系统源码解析
- 掌握Spark Streaming与Maven集成的分布式大数据处理
- 深入学习推荐系统:教程、案例与项目实践
- Web开发者必备的取色工具软件介绍
- C语言实现李春葆数据结构实验程序
- 超市管理系统开发:asp+SQL Server 2005实战
- Redis伪集群搭建教程与实践
- 掌握网络活动细节:Wireshark v3.6.3网络嗅探工具详解
- 全面掌握美赛:建模、分析与编程实现教程
- Java图书馆系统完整项目源码及SQL文件解析
- PCtoLCD2002软件:高效图片和字符取模转换
- Java开发的体育赛事在线购票系统源码分析