1、计数排序
场景:要求对学生成绩进行排序,而且相同成绩的顺序保持不变
/**
*@arr表示学生成绩的数组
*@maxVal表示成绩最高分(也可以是学生总人数,此时需要判断最高分)
*追求尽可能低的时间复杂度
*学生成绩在0~100分之间
*/
首先判断稳定排序有冒泡( O ( n 2 ) O(n^2) O(n2))、插入( O ( n 2 ) O(n^2) O(n2))、归并( O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n)))、计数( O ( n + k ) O(n+k) O(n+k))、桶( O ( n + k ) O(n+k) O(n+k))、基数( O ( n ∗ k ) O(n*k) O(n∗k))排序这么几种。由于成绩的范围确定,所以这里优先选择计数排序。
class solution {
public:
void CountSort(vector<int> &arr, int maxVal){
if(arr.size() == 0) return;
vector<int> count(maxVal + 1, 0); ///初始化maxVal+1大小的数组
vector<int> tmp(arr); // 保存arr的一个副本
for(auto x : arr) /// 统计每个值的个数
count[x]++;
/* *
* 如果是给的总人数,那么可以在这个统计过程中去找最大值,
* vector<int> count(maxVal + 1, 0); 这一句就会放在找到
* *最大值之后来初始化
**/
for(int i = 1; i <= maxVal; i++)
count[i] += count[i - 1]; /// 计算比i小的元素的个数
for(int i = arr.size() - 1; i >=0; i--){
arr[count[tmp[i]] - 1] = tmp[i]; //将tmp[i]排序到正确位置
count[