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

来源:互联网 发布:mac终端命令保存退出 编辑:程序博客网 时间:2024/04/28 05:27
/* *功能描述: 计数法排序 * 参数说明: 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}