计数排序算法实现(函数模板)

/*
 *功能描述: 计数法排序
 * 参数说明: 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
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值