計數排序

     計數排序是一種非比較的排序算法,它的思想其實很簡單,就是先開闢一塊空間用來存放數據出現的次數,然後就要統計出數據出現的次數,並將其放在對應的位置下標上,最後我們可以根據統計的次數依次還原出來就有序了,如下圖分析:


代碼實現:

void CountSort(int* a,int n)
{
	assert(a);
	int max=a[0];
	int min=a[0];
	//1.先統計數據中的最大值和最小值,然後確定範圍
	for(int i=0;i<n;++i)
	{
		if(a[i]>max)
			max=a[i];

		if(a[i]<min)
			min=a[i];
	}
	int range=max-min+1;
	int* count=new int[range];  //用來存放數據出現的次數
	memset(count,0,sizeof(int)*range);

	//2.遍歷數據放在對應的位置
	for(int i=0;i<n;++i)
	{
		count[a[i]-min]++;
	}
	//3.將數據按統計的次數依次還原
	int index=0;
	for(int i=0;i<range;++i)
	{
		while(count[i]--)
		{
			a[index++]=i+min;
		}
	}
	delete[] count;
}

計數排序,在數據範圍比較大或是數據太過分散的時候佔用空間就很大,這種情況就不太適用,而且只能對無符號數進行排序(沒有比較),但是它有一個很明顯的優勢是:在數據範圍較集中時,排序效率是相當高的。

時間複雜度爲O(N+範圍),空間複雜度爲O(範圍)。


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