非比较排序:计数排序

**计数排序(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;
}

猜你喜欢

转载自blog.csdn.net/aixintianshideshouhu/article/details/83714197