计数排序实现
一,首先我们谈谈计算字母的个数
由于字母自由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