码迷,mamicode.com
首页 > 编程语言 > 详细

计数排序实现

时间:2016-05-01 20:25:16      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

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

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

#include<iostream>

using namespace std;

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

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

    // 先统一换成小写 
    for (int i = 0; s[i]; 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

 

计数排序实现

标签:

原文地址:http://www.cnblogs.com/jlxuexijidi-2015/p/5451012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!