计数排序(C语言)

一、原理

        对待排序数组遍历两次:
        第一次,遍历选出max与min,从而算出范围range=max-min,创造一个元素个数为range的数组并将其所有元素初始化成0
        第二次,遍历统计各元素出现的次数,记录在tmp数组中
        根据tmp数组填充arr,使之有序

画图分析:

代码展示:

void CountSort(int* arr, int sz)
{
	int max = arr[0];
	int min = arr[0];
	//第一次遍历选出max与min
	for (int i = 0; i < sz; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];
		}
		if (arr[i] < min)
		{
			min = arr[i];
		}
	}
	//根据max与min确定范围range作为tmp的大小
	int range = max - min + 1;
	//创建tmp数组
	int* tmp = (int*)malloc(sizeof(int) * range);
	if (tmp == NULL)
	{
		perror("malloc failure");
		return -1;
	}
	//将tmp数组所有元素初始化为0
	memset(tmp, 0, sizeof(int) * range);
	//第二次遍历在tmp中填充arr中各元素出现次数
	for (int i = 0; i < sz; i++)
	{
		tmp[arr[i] - min]++;//注意理解这句代码
	}
	int j = 0;//j变量用于调控arr数组的下标
	//在arr中填充元素
	for (int i = 0; i < range; i++)
	{
		while (tmp[i])
		{
			arr[j++] = i + min;
			tmp[i]--;
		}
	}
}

int main()
{
	int arr[] = { 5,2,3,8,7,6,6,5,5,4,1,1,4,7,8,9,0,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	CountSort(arr, sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

 二、特性总结

1.适用于范围集中,极差不大的整形数组的排序
2.时间复杂度:O(N)
3.空间复杂度:O(N)

四、小结

        本人是C语言萌新一枚,希望能和大家多多交流,共同进步。如果对文章内容有什么指正、建议、疑问。欢迎在下方评论区留言一起探讨,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值