計數排序(Counting Sort)

計數排序

是一種穩定的排序算法。計數排序使用一個額外的數組C,其中第i個元素是待排序數組A中值等於i的元素的個數。而後根據數組C來將A中的元素排到正確的位置。ios

計數排序的特徵

當輸入的元素是 n 個 0 到 k 之間的整數時,它的運行時間是 Θ(n + k)。計數排序不是比較排序,排序的速度快於任何比較排序算法。算法

因爲用來計數的數組C的長度取決於待排序數組中數據的範圍(等於待排序數組的最大值與最小值的差加上1),這使得計數排序對於數據範圍很大的數組,須要大量時間和內存。例如:計數排序是用來排序0到100之間的數字的最好的算法,可是它不適合按字母順序排序人名。可是,計數排序能夠用在基數排序中的算法來排序數據範圍很大的數組。數組

通俗地理解,例若有10個年齡不一樣的人,統計出有8我的的年齡比A小,那A的年齡就排在第9位,用這個方法能夠獲得其餘每一個人的位置,也就排好了序。固然,年齡有重複時須要特殊處理(保證穩定性),這就是爲何最後要反向填充目標數組,以及將每一個數字的統計減去1的緣由。 算法的步驟以下:spa

  1. 找出待排序的數組中最大和最小的元素
  2. 統計數組中每一個值爲i的元素出現的次數,存入數組C的第i
  3. 對全部的計數累加(從C中的第一個元素開始,每一項和前一項相加)
  4. 反向填充目標數組:將每一個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1

示例代碼

#include<iostream>

using namespace std;
int data[13]={0,100,9,45,2,9,7,7,6,8,66,88,1230};

int myCountingSort(int ds[],int length){
	int min=ds[0],max=ds[0];//找最大最小值
	for(int i=0;i<length;i++){
		if(ds[i]<min)
			min=ds[i];
		if(ds[i]>max)
			max=ds[i];
	}
	const int ls=max-min+1;
	int *countArr=(int *)malloc(sizeof(int)*ls);
	for(int i=0;i<ls;i++)
		countArr[i]=0;
	for(int i=0;i<length;i++)
		countArr[ds[i]-min]++;//計數
	for(int i=0;i<ls;i++)//排序
		while(0 != countArr[i]--){
			//cout<<i+min<<" " ;
			static int j=0;
			ds[j++]=i+min;
		}
	return 0;
}

int main(){
	myCountingSort(data,13);
	for(int i=0;i<13;i++)
		cout<<data[i]<<" ";
	getchar();
	return 0;
}
相關文章
相關標籤/搜索