十大排序算法之计数排序(CountingSort)

一、前言
数据结构与算法,顺便刷leetcode,无意间发现了一个 我觉得讲解的比较好的网页,并且会拿leetcode里面的题目当做例题,如有需要,奉上网址:五分钟学算法

二、算法简介
将输入的数据值转化为键存储在额外开辟的数组空间内。
要求:输入的数据是有确定范围的。

三、算法的思想

  1. 获取输入序列的最大值max和最小值min。
  2. 开辟一个数组空间tmp,其大小为max-min+1。
  3. 数组tmp存放的是输入元素出现次数。
  4. 按数组tmp中元素存放的顺序输入元素。

四、算法的图示(图片来源于网络)
十大排序算法之计数排序(CountingSort)_第1张图片

五、代码

void CountingSort(vector<int> dp)
{
     
	int min,max;
	min=dp[0],max=dp[0];
	for(int i=0;i<dp.size();i++)
	{
     
		min=(min<dp[i])? min:dp[i];
		max=(max>dp[i])? max:dp[i];
	}
	int* tmp=new(max-min+1,0);
	for(int i=0;i<dp.size();i++)
		tmp[dp[i]-min]++;
	int j=0;
	for(int i=0;i<dp.size();i++)
		while(tmp[j]!=NULL)
			if(tmp[j]!=0)
			{
     
				dp[i]=tmp[j]+min;
				tmp[j]--;
			}
	        else
				j++;
}

六、算法的性能

  1. 稳定性:在元素往tmp中记录时按顺序遍历,从tmp中取出元素也是按顺序取出,相同元素相对位置不会发生变化,故稳定。
  2. 空间复杂度:O(k),k为桶的个数。
  3. 时间复杂度:O(n+k)。

你可能感兴趣的:(数据结构与算法学习,算法,数据结构,排序算法,c++)