【学习笔记】我的C++排序算法

1、计数排序

场景:要求对学生成绩进行排序,而且相同成绩的顺序保持不变

/**
*@arr表示学生成绩的数组
*@maxVal表示成绩最高分(也可以是学生总人数,此时需要判断最高分)
*追求尽可能低的时间复杂度
*学生成绩在0~100分之间
*/

首先判断稳定排序有冒泡O(n2)O(n^2))、插入O(n2)O(n^2))、归并O(nlog(n))O(nlog(n)))、计数O(n+k)O(n+k))、O(n+k)O(n+k))、基数O(nk)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[tmp[i]]--;
	    }
    }
};

Reference
https://blog.csdn.net/yf_li123/article/details/76930121
https://blog.csdn.net/u012562943/article/details/100136531

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章