当前位置:编程学习 > C/C++ >>

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

这里是 Introduction to Algorithm 算法导论书中第八章的计数排序 counting sort, 本专题还是以这本书为主,用c++实现其中最重要的算法。
网上也有很多高手研究了这本书,给出了读书摘要;但是先要深入学习这本书的话,还是需要自己去看书的。 本专题的特色就是直接给出程序实现;
这本书的算法还是非常简明易懂的,就是算法分析和一些数学问题会比较难,这些内容还是需要有时间自己慢慢研究的,不过有些比较深入的内容的话,工作中用的会比较少,所以这里主要实现其中的算法。
下面是计数排序 counting sort 的全部代码。
 
#include<iostream>  
#include<vector>  
#include<algorithm>  
using namespace std;  
  
void countingSort(vector<int> &ib, vector<int> &ia, int maxEle)  
{  
    vector<int> ic;//new vector<int>[11]; 这里用new会出现下标溢出的错误!!!  
    int i = 0;  
    ic.resize(maxEle+1,0);//注意这是正确的单个vector分配空间的正确用法!!!  
  
    for(auto x:ia)  
    {  
        ic[x]++;  
    }  
  
    for(i=1; i<=maxEle; i++)  
    {  
        ic[i]=ic[i]+ic[i-1];  
    }  
  
    for(i=ia.size()-1; i>=0; i--)  
    {  
        ib[ic[ia[i]]-1]=ia[i];  
        ic[ia[i]]--;  
    }  
}  
  
void countingSort(vector<int> &ia, int maxEle)  
{  
    vector<int> ib(ia);  
    countingSort(ia,ib,maxEle);  
}  
  
template<typename T>  
class Print  
{  
public:  
    Print(){}  
    void inline operator()(const T& x) const{cout<<x<<" ";}  
};//这就是函数对象,这里并没有带数据,只是一个简单的输出操作。  
  
int main()  
    try  
{  
    {  
        int a[4]={5,2,9,8};   
        vector<int> vecI1(a,a+4);  
        vector<int> vecI11(4);  
        int b[7]={2,10,7,10,9,4,5};  
        vector<int> vecI2(b,b+7);  
        vector<int> vecI22(7);  
  
        countingSort(vecI1,9);  
        countingSort(vecI2,10);  
  
        for(auto x:vecI1)  
        {//C++11标准遍历数组,非常方便  
            cout<<x<<" ";  
        }  
        cout<<endl;  
  
        for_each(vecI2.begin(), vecI2.end(), Print<int>());  
        cout<<endl;  
        //这里利用stl中的函数实现输出  
  
        return 0;  
    }  
}  
catch(out_of_range)  
{  
    cerr<<"range error\n";  
}  
catch(...)  
{  
    cerr<<"unknow exception thrown\n";  
}  

 

 
重点还是要注意下标的问题,和vector的用法,vector分配内存问题。算法并不难实现。
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,