/*
*功能描述: 计数法排序
* 参数说明: min~max:输入整数的范围(包括边界)
* n:输入数据的个数
*/
#include<iostream>
using namespace std;
/*--------------------------------------------------------
参数说明: min:输入数据的下界(包括边界)
max: 输入数据的上界 (包括边界)
number:待排序数据的数量
asc:输出方式,true表示升序,false表示降序
编程思想: 对输入的每个数据出现的次数进行计数,累加后得到所有数据中不大于该数据的个数,
然后从后扫描输入的数据,放到以该数据出现次数为下标的位置,次数记录相应自减,
保证了算法的稳定性,然后得到排好序的数组。
--------------------------------------------------------*/
template <class T>
void counterSort(T min, T max, int number, bool asc){
int i; //临时变量用于计数
T counter[max-min+1];//计数数组
T original[number+1];//用于存放原始数组
T result[number+1];//用于存放结果数组
for(i = 1; i < max-min+1+1; i++) {
counter[i] = 0;//初始化计数数组为0
}
for(i = 1; i < number + 1; i++) {
cin>>original[i];//输入数据
counter[original[i]]++;//更新相应的计数器,counter[i]表示数据i出现的次数
}
for(i = 2; i < max-min+1+1; i++) {
counter[i] += counter[i-1];//更新计数器,counter[i]表示小于等于i的数据出现的次数
}
for(i = number; i > 0; i--) {
result[counter[original[i]]] = original[i];
counter[original[i]]--;//相应更新计数器
}
if(asc){ //升序输出结果
for(i = 1; i < number; i++) {
cout<<result[i]<<" ";
}
cout<<result[i]<<endl;
}
else { //降序输出
for(i = number; i > 1; i--) {
cout<<result[i]<<" ";
}
cout<<result[i]<<endl;
}
}
int main(){
/*
int a,b,n; //k表示输入数据的范围1-k,n表示数据的个数
cin>>k>>n;
int count[k+1];//用于对原来的数据计数
int num[n+1]; //用于存储需要排序的数据
int num2[n+1];//用于存储排好序的数据
int i;
for(i = 1; i < k+1; i++) {
count[i] = 0; //初始化计数数组
}
for(i = 1; i < n+1; i++){
cin>>num[i]; //输入数据
count[num[i]]++;//更新计数,count[i]表示数字i出现的次数
}
for(i = 2; i < k+1; i++) {
count[i] += count[i-1];//count[i]表示小于等于i的数字出现的次数
}
for(i = n; i > 0; i--) {
num2[count[num[i]]] = num[i];//将相应元素放到相应位置
count[num[i]]--;//更新计数数组
}
for(i = 1; i < n; i++){
cout<<num2[i]<<" ";
}
cout<<num2[i]<<endl;
return 0;
*/
// void counterSort(int min, int max, int number, bool asc);
counterSort(1,10,15,true);
counterSort(1,10,15,false);
//9 8 7 6 5 4 3 2 1 1 2 3 4 5 6
}
计数排序算法实现(函数模板)
最新推荐文章于 2023-08-13 20:05:57 发布