1. 程式人生 > >非比較排序:計數排序

非比較排序:計數排序

**計數排序(Count Sort)**是一個非基於比較的排序演算法,該演算法於1954年由 Harold H. Seward 提出。它的優勢在於在對一定範圍內的整數排序時,它的複雜度為Ο(n+k)(其中k是整數的範圍),快於任何比較排序演算法。

計數排序的思想類似於雜湊表中的直接定址法,在給定的一組序列中,先找出該序列中的最大值和最小值,從而確定需要開闢多大的輔助空間,每一個數在對應的輔助空間中都有唯一的下標。

計數排序的思路如下

1、找出序列中最大值和最小值,開闢Max-Min+1的輔助空間
2、最小的數對應下標為0的位置,遇到一個數就給對應下標處的值+1,。
3、遍歷一遍輔助空間,就可以得到有序的一組序列

程式碼實現如下

void CountSort(int* arr, int n)
{
	int i = 0;
	int index = 0;
	int range = 0;
	int* count = NULL;
	int max = arr[0];
	int min = arr[0];
	//遍歷原陣列找出最大值和最小值
	for(i=0; i<n; i++)
	{
		if(arr[i] > max)
		{
			max = arr[i];
		}
		if(arr[i] < min)
		{
			min = arr[i];
		}
	}

	range = max - min + 1;//需要開闢空間的大小
	count = (int*)malloc(sizeof(int)*range);
	memset(count,0,sizeof(int)*range);//把輔助空間初始化為0
	
	for(i=0; i<n; i++)
	{    
		count[arr[i]-min]++;//arr[j]-min是原陣列中的對應到輔助空間下標
	}

	for(i=0; i<range; i++)//遍歷輔助空間
	{
		while(count[i]--)//下標處的值是幾,說明該數出現了幾次
		{
			arr[index] = i + min;//將下標出的數放回原陣列
			index++;
		}
	}
	free(count);
	count = NULL;
}