常見排序算法:計數排序算法

基本原理:根據統計待排序數組中某個數大於等於其他數的個數來確定排序後所在的位置計數排序是一種非常快捷的穩定性強的排序方法,時間複雜度O(n+k),其中n爲要排序的數的個數,k爲要排序的數的組大值。計數排序對一定量的整數排序時候的速度非常快,一般快於其他排序算法。但計數排序侷限性比較大,只限於對整數進行排序。消耗空間複雜度來獲取快捷的排序方法,其空間複雜度爲O(K),K爲要排序的最大值。

1.首先找出待排序數組的最大值,用來創建臨時空間,該臨時空間的大小就是最大值+1;該臨時空間用來存放每個數出現的次數。

2. temp數組大小爲9,下標範圍爲0-max,對於索引8來說,8在待排序數組中出現了1次,即temp[8]=1;對於索引6來說,6在在待排序數組中出現了2次,即temp[6]=2;以此類推。

3. 對所有的計數進行累加,即對於第i個位置,統計小於等於i的所有個數,重新覆寫到temp數組中,對於索引3來說,小於等於3的總個數爲2。對於索引7來說,小於等於7的總個數爲7。

4.反向填充目標數組:根據待排序數組中的元素值放在統計的個數值-1處,即對於待排序數8來說,首先找到temp的索引爲8處,該統計的個數減去一,爲7,即8放在排序結果數組的索引7處。即對於待排序數5來說,首先找到temp的索引爲5處,該統計的個數減去一,爲3,即5放在排序結果數組的索引3處。即對於待排序數6來說,首先找到temp的索引爲6處,該統計的個數減去一,爲5,即6放在排序結果數組的索引5處。對於第二個6來說,因爲前面統計個數爲5,這裏減一爲4,即第二個6放在排序結果數組的索引4處。

代碼:

//計數排序
void Counting_Sort(int list[], int n)
{
	int max = 0;

	//找出待排序的數組中最大值
	for (int i = 0; i < n; i++)
	{
		if (list[i] > max)
		{
			max = list[i];
		}
	}

	//創建的臨時數組大小比最大值大1,該數組用來對原數組的值統計個數,範圍0-max,共max+1個
	int *temp = new int[max + 1];
	//初始化爲0
	memset(temp, 0, sizeof(int)*(max + 1));

	//對每個數字統計個數,下標代表原數組中的數
	for (int i = 0; i < n; i++)
	{
		temp[list[i]]++;
	}
	
	//統計對於i值來說小於等於i值的個數,對於原數組來說統計小於當前值的所有個數
	for (int i = 1; i < max + 1; i++)
	{
		temp[i] = temp[i] + temp[i - 1];
	}

	//存放排序結果
	int *res = new int[n];

	for (int i = 0; i < n; i++)
	{
		temp[list[i]]--;//統計的個數減一
		res[temp[list[i]]] = list[i];//放在統計的個數的位置處
	}

	for (int i = 0; i < n; i++)
	{
		list[i] = res[i];
	}
	delete[] temp;
	delete[] res;
}

時間複雜度爲O(N+k),k爲要排序的數組範圍即最大值。空間複雜度:O(k),穩定性:穩定

 

 

 

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