1、計數排序
場景:要求對學生成績進行排序,而且相同成績的順序保持不變
/**
*@arr表示學生成績的數組
*@maxVal表示成績最高分(也可以是學生總人數,此時需要判斷最高分)
*追求儘可能低的時間複雜度
*學生成績在0~100分之間
*/
首先判斷穩定排序有冒泡()、插入()、歸併()、計數()、桶()、基數()排序這麼幾種。由於成績的範圍確定,所以這裏優先選擇計數排序。
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[tmp[i]]--;
}
}
};
Reference
https://blog.csdn.net/yf_li123/article/details/76930121
https://blog.csdn.net/u012562943/article/details/100136531