计数排序实现

一,首先我们谈谈计算字母的个数

由于字母自由26个所以我们可以新建一个数组来存放各个字母的个数。

#include<iostream>

using namespace std;

/*
**统计字母的个数
*/

int main()
{
    char s[13] = "Hello World!";
    int c[26] = { 0 };

    // 先统一换成小写 
    for (int i = 0; i!=sizeof(s); i++)
        if (s[i] >= 'A' && s[i] <= 'Z')
            s[i] = s[i] - 'A' + 'a';

    // 通过新建数组来统计字母个数 
    for (int i = 0; s[i]; i++)
        if (s[i] >= 'a' && s[i] <= 'z')
            c[s[i] - 'a']++;

    // 打印结果
    for (int i = 0; i<26; i++)
        cout << char('a' + i) << ":" << c[i] << " ";
    cout << endl;
    return 0;
}

 

二,计数排序法

计数排序法跟上面的例子有很大的联系,我们首先需要找到需排序数组的最大值max,然后建立一个包含max+1数的数组,用来存放0~max数字的个数。然后从头遍历该数组来对原数组进行排序。

#include<iostream>
#include<vector>

using namespace std;
/*
**计数排序法
*/

int main()
{
    int a[] = { 4, 6, 6, 4, 6, 4, 9, 1, 5, 6 };//任意的数组 
    int max = 0;
    //找出最大值max 
    for (int i = 0; i != (sizeof(a) / sizeof(int)); ++i)
    {
        if (a[i]>max)
            max = a[i];
    }
    //建立一个0~max的vector来存放数字的个数 
    vector<int>ivec(max + 1, 0);
    for (int i = 0; i != (sizeof(a) / sizeof(int)); ++i)
    {
        ivec[a[i]]++;
    }
    //测试上面的转换是否正确 
    //    for(int i=0;i!=ivec.size();++i)
    //        cout<<ivec[i]<<endl;
    for (int i = 0, j = 0; j != ivec.size() && i<(sizeof(a) / sizeof(int)); ++j)
    {
        while (ivec[j]>0)
        {
            ivec[j]--;
            a[i++] = j;
        }
    }

    //测试
    for (int i = 0; i != (sizeof(a) / sizeof(int)); ++i)
        cout << a[i] << " ";
    cout << endl;
}

三,统计数字个数

最后讲讲统计数字的个数,统计数字的个数可以参考上面一中的做法,但是当数字个数大了之后,就不是太好操作了,所以我们可以利用map来帮助我们,map中有key—value,我们可以把我们需要统计的数字当做map的key,把数字的个数放在key对于的value。

#include<iostream>
#include<map>

using namespace std;
/*
**统计数字数量
*/
int main()
{
    int a[] ={1, 5, 1, 2, 3, 2, 10000000};  //任意的数组
    map<int, int> m;

    // 存放数字个数
    for (int i = 0; i<(sizeof(a)/sizeof(int)); i++)
        m[a[i]]++;

    // 打印结果
    for (map<int,int>::iterator it=m.begin(); it!=m.end(); ++it)
         cout << it->first <<"的个数为"<< ':' << it->second << endl;
    
    /*
    **找到特定的数字,并打印出该数字的个数
    **map<int, int>::iterator it = m.find(1);
    **if (it != m.end())
    **    cout << it->second;
     */
    return 0;
}

 

参考:http://www.csie.ntnu.edu.tw/~u91029/index.html

 

posted on 2016-05-01 19:47  延长比赛  阅读(282)  评论(0编辑  收藏  举报

导航