漫画算法笔记
计数排序
#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <iterator>
#include <numeric>
using namespace std;
vector<int> countSort1(vector<int>& vec)
{
int max = *std::max_element(vec.begin(), vec.end());
vector<int> countVec(max + 1);
for (int i = 0; i < vec.size(); ++i )
{
countVec[vec[i]]++;
}
int index = 0;
vector<int> resVec(vec.size());
for ( int i = 0; i < countVec.size(); ++i )
{
for ( int j = 0; j < countVec[i]; ++j )
{
resVec[index++] = i;
}
}
return resVec;
}
vector<int> countSort2(vector<int>& vec)
{
int max, min;
auto minMax = std::minmax_element(vec.begin(), vec.end());
min = *minMax.first;
max = *minMax.second;
int d = max - min;
vector<int> countVec(d + 1);
for (int i =0; i < vec.size(); ++i)
{
countVec[vec[i] - min]++;
}
std::partial_sum(countVec.begin(), countVec.end(), countVec.begin());
vector<int> resVec(vec.size());
for (int i = vec.size() - 1; i >=0; --i)
{
resVec[countVec[vec[i] - min] - 1] = vec[i];
--countVec[vec[i] - min];
}
return resVec;
}
void test01()
{
vector<int> vec = {4, 4, 6, 5, 3, 2, 8, 1, 7, 5, 6, 0, 10};
vec = countSort1(vec);
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(cout, " "));
cout << endl;
}
void test02()
{
vector<int> vec = {95, 94, 91, 98, 99, 90, 99, 93, 91, 92};
vec = countSort2(vec);
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(cout, " "));
cout << endl;
}
int main(int argc, char** argv)
{
test02();
system("pause");
return 0;
}