#include <string>
#include <iostream>
#include "CountingSort.h"
//这个头文件主要是为了计算一个数组中的最大值。
#include "../../Max.cpp"
template <class T> CountingSort<T>::CountingSort(){
m_resultArrayPtr = NULL;
}
template <class T> CountingSort<T>::~CountingSort(){
delete [] m_resultArrayPtr;
}
template <class T> bool CountingSort<T>::Sort(T* needSortArrayPtr,long length){
if( length < 1 ) return false;
if(_FindMax(needSortArrayPtr,length)!=true) return false;
//之所以有这个判断是因为,计数排序的前提是数据集必须为正整数,
//因此,如果最大值为负时,则数据集一定不全为正,
if(m_max < 0) return false;
long numberLineCount(0);
numberLineCount = static_cast<long>(m_max);
// “数轴”,用于存放数据集中每个数值出现的频率
T *numberLinePtr = new T[numberLineCount];
memset(numberLinePtr,0,numberLineCount*sizeof(T));
long index(0);
for(int i= 0;i<length;i++){
index = static_cast<long>(*(needSortArrayPtr+i));
++ (*(numberLinePtr+index-1));
}
//计算出数据集中每个数值在位置,注意:这里是理解这个非比较算法的重点,
for(int i=1;i<numberLineCount;i++){
(*(numberLinePtr+i)) += (*(numberLinePtr+i-1));
}
m_resultArrayPtr = new T[length];
memset(m_resultArrayPtr,0,length*sizeof(T));
for(int i=0;i < length;i++){
//这里先用拿到数据集中的一个数值
index = static_cast<long>(*(needSortArrayPtr+i));
//由这个数值作为索引去取这个数值的位置
//问:”数轴“为什么不会越界呢?
//答:之前我们new这个”数轴“的时候是以整个数据集中的最大值来创建的。
index = static_cast<long>(*(numberLinePtr+index - 1));
//由位置直接插入。
*(m_resultArrayPtr+index-1) = static_cast<long>(*(needSortArrayPtr+i));
//这一步是必须的,如果数据集中有相同的数值时,必须减1。
--(*(numberLinePtr+*(needSortArrayPtr+i) - 1));
}
delete [] numberLinePtr;
return true;
}
template <class T> T* CountingSort<T>::GetResult(){
if(m_resultArrayPtr!=NULL) return m_resultArrayPtr;
}
template <class T> bool CountingSort<T>::_FindMax(T* needSortArrayPtr,long length){
Max<T> max;
m_max = max.GetMax(needSortArrayPtr,length);
return true;
}
BT六眼飞鱼
- 粉丝: 57
- 资源: 33
最新资源
- 基于Java学生管理系统设计
- 轻舟已过万重山,两岸猿声啼不住
- 炫酷的CSS3登录页面实现
- 基于Java的线上教育网站的设计与实现【附源码】
- LibreOffice Math 指南.pdf
- fiji-仅限个人学习
- 利用SVM(支持向量机)进行图像分割/提取-MATLAB
- 国产DSP AD1565 规格书
- COMSOL变压器温度场流体场二维计算模型,可以得到变压器达到稳态时的温度场和流体场分布
- 学生信息管理系统——c语言
- 百度指数爬虫程序,通过传入登陆百度指数网页之后,输入网页中的cooki序列和想要查询的关键词即可获得想要时间段的关键词搜索数量
- 国产DSP芯片 AD1452
- LibreOffice-7-3-Impress-演示文稿指南-rev1.pdf
- 爬取百度指数 代码,如果cookies失效的,麻烦替换下,爬取关键词和访问量,并保存csv
- 基于Bootstrap实现的生鲜超市模板
- 1_comp0035_coursework_02_2024-v02 (1)(2).pdf
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈