修复计数排序的异常,让原始序列的最大值+1作为计数容器的大小;解决算法目录与STL算法目录的链接冲突问题

This commit is contained in:
huihut 2018-11-06 21:58:47 +08:00
parent 056ea33f6d
commit 433d20e0d9
2 changed files with 45 additions and 35 deletions

View File

@ -2,51 +2,61 @@
ii位i0
0kk过大则会引起较大的空间复杂度
OnOn+k
0k
k 0 100
On+k On+k
1.
2. i C i
3. C
4. i C[i] C[i] 1
*****************/
#include<iostream>
#include<vector>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void countSort(vector<int>& vec,vector<int>& objVec)
// 计数排序
void CountSort(vector<int>& vecRaw, vector<int>& vecObj)
{
vector<int> range(10,0); //range的下标即键值
for(int i=0;i<vec.size();++i)
{//统计每个键值出现的次数
range[vec[i]]++;
}
// 确保待排序容器非空
if (vecRaw.size() == 0)
return;
for(int i=1;i<vec.size();++i)
{//后面的键值出现的位置为前面所有键值出现的次数之和
range[i]+=range[i-1];
}
//至此range中存放的是相应键值应该出现的位置
int length=vec.size();
for(int i=length-1;i>=0;--i) //注意一个小细节,统计时最正序的,这里是逆序
{//如果存在相同的键值,为了保持稳定性,后出现的应该还是位于后面
//如果正序,则先出现的会放置到后面,因此不再稳定
objVec[range[vec[i]]]=vec[i]; //将键值放到目标位置
range[vec[i]]--;
}
// 使用 vecRaw 的最大值 + 1 作为计数容器 countVec 的大小
int vecCountLength = (*max_element(begin(vecRaw), end(vecRaw))) + 1;
vector<int> countVec(vecCountLength, 0);
// 统计每个键值出现的次数
for (int i = 0; i < vecRaw.size(); i++)
countVec[vecRaw[i]]++;
// 后面的键值出现的位置为前面所有键值出现的次数之和
for (int i = 1; i < vecCountLength; i++)
countVec[i] += countVec[i - 1];
// 将键值放到目标位置
for (int i = vecRaw.size(); i > 0; i--) // 此处逆序是为了保持相同键值的稳定性
vecObj[--countVec[vecRaw[i - 1]]] = vecRaw[i - 1];
}
int main()
{
int a[14]={0,5,7,9,6,3,4,5,2,8,6,9,2,1};
vector<int> vec(a,a+14);
vector<int> objVec(14,0);
vector<int> vecRaw = { 0,5,7,9,6,3,4,5,2,8,6,9,2,1 };
vector<int> vecObj(vecRaw.size(), 0);
countSort(vec,objVec);
CountSort(vecRaw, vecObj);
for(int i=0;i<objVec.size();++i)
cout<<objVec[i]<<" ";
cout<<endl;
for (int i = 0; i < vecObj.size(); ++i)
cout << vecObj[i] << " ";
cout << endl;
return 0;
}

View File

@ -1229,11 +1229,11 @@ class doSomething(Flyable *obj) // 做些事情
## STL
### 索引
### STL 索引
[STL 方法含义](https://github.com/huihut/interview/tree/master/STL)
[STL 方法含义索引](https://github.com/huihut/interview/tree/master/STL)
### 容器
### STL 容器
容器 | 底层数据结构 | 时间复杂度 | 有无序 | 可不可重复 | 其他
---|---|---|---|---|---
@ -1253,7 +1253,7 @@ hash_multiset|哈希表|插入、删除、查找 O(1) 最差 O(n)|无序|可重
hash_map|哈希表|插入、删除、查找 O(1) 最差 O(n)|无序|不可重复|
hash_multimap|哈希表|插入、删除、查找 O(1) 最差 O(n)|无序|可重复|
### 算法
### STL 算法
算法 | 底层算法 | 时间复杂度 | 可不可重复
---|---|---|---