【學習筆記】我的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

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