计数排序——不用比较的排序

原理:
计数排序——不用比较的排序_第1张图片
代码:

void CountSort(int* a, int n)
{
	int max = a[0];
	int min = a[0];
	for (int i = 0; i < n; i++)
	{
		if (a[i] > max)
		{
			max = a[i];
		}
		if (a[i] < min)
		{
			min = a[i];
		}
	}
	int grang = max - min + 1;
	int* count = (int*)malloc(sizeof(int) * grang);
	memset(count, 0, sizeof(int) * grang);//因为要计数,所以当那个位置没有数的话要是0,所以在这里要把count数组初始化为0

	//统计数据出现的次数
	for (int i = 0; i < n; i++)
	{
		count[a[i]-min]++;
	}
	//排序
	int j = 0;
	for (int i = 0; i < n; i++)
	{
		while (count[i]--)
		{
			a[j++] = i + min;//覆盖原数组
		}
	}
}

时间复杂度和空间复杂度:
计数排序——不用比较的排序_第2张图片
在范围比较计集中(重复数据比较多的时候)——计数排序遥遥领先

你可能感兴趣的:(算法,数据结构)