数据结构:计数排序(详解)

思路详解:

1 找到数组中的最大值、最小值

2 开辟一个统计每个数据出现次数的数组(总个数是最大值-最小值+1,因为下标范围是0~最大值-最小值,闭区间统计个数要+1)

3 遇到一个元素,在此元素-最小值作为下标的空间处++,统计次数

4 遍历计数数组,不为空,则数值是几就写入几次 下标+最小值到原数组

代码实现:

void CountSort(int* a, int n)
{
	int i = 0;
	int min = a[0];
	int max = a[0];
	for (i = 0; i < n; i++)//找最大值、最小值
	{
		if (a[i] < min)
		{
			min = a[i];
		}

		if (a[i] > max)
		{
			max = a[i];
		}
	}

	int range = max-min + 1;
	int* tmp = (int*)malloc(sizeof(int) * range);
	memset(tmp, 0, sizeof(int) * range);//初始化数组内容全部为0,方便统计,否则是随机值

	for (i = 0; i < n; i++)//统计数据出现次数
	{
		tmp[a[i] - min]++;
	}

	int k = 0;
	for (i = 0; i < range; i++)//根据数据出现次数,从下标0开始写入原数组
	{
		while (tmp[i]--)
		{
			a[k++] = i + min;
		}
	}
}

完结撒花~

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