计数排序.

  一.定义:

计数排序(Counting Sort)是一种非比较性质的排序算法,其时间复杂度为O(n+k)(其中n为待排序的元素个数,k为不同值的个数)。这意味着在数据值范围不大并且离散分布的情况下,规模越大,排序速度越快的特点。然而,如果数列元素不满足整数和有确定范围的条件,则不能使用计数排序。

二.原始代码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

// 计数排序
void count_sort(int num[], int len) {
	// 寻找最大值
    int max = num[0];
	for (int i = 1; i < len; i++) {
		max = max > num[i] ? max : num[i]; // 更新最大值
	}

	int range = max + 1; // 计数数组的长度为最大值加1
	int *arr = (int *)malloc(sizeof(int) * range);	// 申请空间

	memset(arr, 0, sizeof(int) * range); // 初始化计数数组为0

	for (int i = 0; i < len; i++) {
		arr[num[i]]++; // 对每个元素进行计数
	}

	// 填充原数组
	int j = 0;
	for (int i = 0; i < range; i++) {
		while (arr[i] != 0) { // 将计数数组中的每个非零元素放回原数组
			num[j] = i; // 填充元素
			arr[i]--; // 计数减一
			j++; // 标记原数组填充到的位置
		}
	}

	free(arr); // 释放计数数组空间
}


int main() {
	int num[12] = { 5, 8, 5, 4, 6, 8, 9, 7, 2, 3, 4, 5 };
	count_sort(num, 12); // 执行计数排序
	// 打印结果
	for (int i = 0; i < 12; i++)
	{
		printf("%d ", num[i]);
	}
	return 0;
}

输出结果:

2 3 4 4 5 5 5 6 7 8 8 9

代码优点:

  1. 计数排序是一个非比较排序算法,对于一个给定的输入数组,不论数组中的数字如何分布,其时间复杂度始终稳定在O(n)。
  2. 擅长处理小范围大量重复的整数数据,效率非常高,实际运行速度通常比其他的O(n log n)比较类排序算法要快。

代码缺点:

  1. 计数排序算法只能用来排序整数,并且只能处理非负整数,对于负整数和小数,此算法无法正常工作,需要进行额外处理才能排序。
  2. 该排序算法需要额外的空间来存储计数数组,如果输入数据的范围(最大值-最小值)过大,将会导致空间的大量浪费。
  3. 如果待排序的数列中最大和最小数值的差过大,需要很大的辅助空间,因此空间复杂度显著上升,空间效率低。
  4. 计数排序是一种不稳定的排序,无法保证相同数值的元素在排序后保持原有的顺序。

三.优化代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// 计数排序函数
void count_sort(int num[], int len) {
	int max = num[0];   // 初始化最大值为数组第一个元素
	int min = num[0];   // 初始化最小值为数组第一个元素

    // 找出数组中最大值和最小值
	for (int i = 1; i < len; i++) {
		max = max > num[i] ? max : num[i];
		min = min < num[i] ? min : num[i];
	}

    int range = max - min + 1;  // 计算最大值与最小值的差值和1(确定结果数组的大小)

	// 动态分配range大小的计数数组,并初始化为0
	int *arr = (int *)malloc(sizeof(int) * range);
	memset(arr, 0, sizeof(int) * range); 

	// 计算每个元素出现的次数
	for (int i = 0; i < len; i++) {
		arr[num[i]-min]++;  // 使用当前元素值减去最小值作为索引
	}

	// 按升序排列原数组
	for (int i = 0, t = 0; i < range; i++) {
		while (arr[i] != 0) {
			num[t] = i + min;  // 使用当前索引加上最小值得到原始值
			t++;
			arr[i]--;   // 减去一个元素的计数
		}
	}

	// 释放动态分配的计数数组空间
	free(arr);
}

int main() {
    // 待排序的数组
	int num[10] = { -10, 10, -9, 9, 8, 7, 7, 6, 6, 6 };

    // 使用计数排序算法进行排序
	count_sort(num, 10);

    // 输出排序后的数组元素
	for (int i = 0; i < 10; i++) {
		printf("%d ", num[i]);
	}

	return 0;
}

优化点:

1.可以实现包含负数的数组排序

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
计数排序(Counting Sort)是一种非比较型整数排序算法,它对输入的数据进行计数,然后根据计数值直接输出排序结果。计数排序适用于数据规模较小且数据分布均匀的情况,它的时间复杂度为O(n+k),其中n是输入数据的数量,k是输入数据的最大值。 在Python中实现计数排序的代码示例如下: ```python def counting_sort(arr): # 确定最大值和计数数组的长度 max_val = max(arr) count_len = max_val + 1 # 初始化计数数组 count = * count_len # 统计每个元素出现的次数 for num in arr: count[num] += 1 # 计算每个元素应该放置的位置 for i in range(1, count_len): count[i] += count[i-1] # 创建输出数组并排序 output = * len(arr) for num in arr: output[count[num]-1] = num count[num] -= 1 return output ``` 上述代码中,我们首先确定输入数组中的最大值,并根据最大值创建一个计数数组,长度为最大值加一。然后统计输入数组中每个元素出现的次数,并将计数结果存入计数数组。接下来,我们通过累加计数数组中的元素,计算每个元素应该放置的位置。最后,我们根据计数数组中的计数值和位置信息,将输入数组中的元素排序并输出。 使用计数排序算法对整数数组进行排序的时间复杂度为O(n+k),空间复杂度为O(n)。在Python中实现计数排序算法时,需要占用一定的额外空间来存储计数数组和输出数组。但是,计数排序算法的稳定性较好,适用于整数数组的排序。在实际应用中,需要根据具体的数据规模和分布情况选择合适的排序算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuga...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值