zoukankan      html  css  js  c++  java
  • 计数排序实现

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

    由于字母自由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

  • 相关阅读:
    codeforces #586 ABC~D
    codeforces #585 div2 ABCD
    编译原理实验 NFA子集法构造DFA,DFA的识别 c++11实现
    codeforces #599 div2 ABCD
    codeforces #598 div3 ABCDF
    codeforces #587 div3 ABCDE
    codeforces educational round 73 div2 ABCD
    Mud Puddles ( bfs )
    2019牛客多校第十场B.Coffee Chicken(递归)
    2019牛客多校训练第七场A. String(暴力)
  • 原文地址:https://www.cnblogs.com/jlxuexijidi-2015/p/5451012.html
Copyright © 2011-2022 走看看