NOIP--算法数据结构C++实现4-计数排序(counting sort)

Introduction to Algorithm 算法导论书中第八章的计数排序 counting sort

下面是计数排序 counting sort 的全部代码。

时间效率很高,但是需要额外空间O(n);其实也可以使用等于关键字数个额外空间,节省很多空间的。

[cpp] 

  1. #include<iostream>  

  2. #include<vector>  

  3. #include<algorithm>  

  4. using namespace std;  

  5.   

  6. void countingSort(vector<int> &ib, vector<int> &ia, int maxEle)  

  7. {  

  8.     vector<int> ic;//new vector<int>[11]; 这里用new会出现下标溢出的错误!!!  

  9.     int i = 0;  

  10.     ic.resize(maxEle+1,0);//注意这是正确的单个vector分配空间的正确用法!!!  

  11.   

  12.     for(auto x:ia)  

  13.     {  

  14.         ic[x]++;  

  15.     }  

  16.   

  17.     for(i=1; i<=maxEle; i++)  

  18.     {  

  19.         ic[i]=ic[i]+ic[i-1];  

  20.     }  

  21.   

  22.     for(i=ia.size()-1; i>=0; i--)  

  23.     {  

  24.         ib[ic[ia[i]]-1]=ia[i];  

  25.         ic[ia[i]]--;  

  26.     }  

  27. }  

  28.   

  29. void countingSort(vector<int> &ia, int maxEle)  

  30. {  

  31.     vector<int> ib(ia);  

  32.     countingSort(ia,ib,maxEle);  

  33. }  

  34.   

  35. template<typename T>  

  36. class Print  

  37. {  

  38. public:  

  39.     Print(){}  

  40.     void inline operator()(const T& x) const{cout<<x<<" ";}  

  41. };//这就是函数对象,这里并没有带数据,只是一个简单的输出操作。  

  42.   

  43. int main()  

  44.     try  

  45. {  

  46.     {  

  47.         int a[4]={5,2,9,8};   

  48.         vector<int> vecI1(a,a+4);  

  49.         vector<int> vecI11(4);  

  50.         int b[7]={2,10,7,10,9,4,5};  

  51.         vector<int> vecI2(b,b+7);  

  52.         vector<int> vecI22(7);  

  53.   

  54.         countingSort(vecI1,9);  

  55.         countingSort(vecI2,10);  

  56.   

  57.         for(auto x:vecI1)  

  58.         {//C++11标准遍历数组,非常方便  

  59.             cout<<x<<" ";  

  60.         }  

  61.         cout<<endl;  

  62.   

  63.         for_each(vecI2.begin(), vecI2.end(), Print<int>());  

  64.         cout<<endl;  

  65.         //这里利用stl中的函数实现输出  

  66.   

  67.         return 0;  

  68.     }  

  69. }  

  70. catch(out_of_range)  

  71. {  

  72.     cerr<<"range error\n";  

  73. }  

  74. catch(...)  

  75. {  

  76.     cerr<<"unknow exception thrown\n";  

  77. }  


重点还是要注意下标的问题,和vector的用法,vector分配内存问题。算法并不难实现。 

 

NOIP信息学视频地址

视频地址

链接:https://pan.baidu.com/s/1tHo1DFMaDuMZAemNH60dmw 
提取码:7jgr

posted @ 2020-10-27 11:09  tianli3151  阅读(130)  评论(0编辑  收藏  举报