排序算法--------计数排序

这篇具有很好参考价值的文章主要介绍了排序算法--------计数排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


排序的介绍

排序算法--------计数排序,排序算法,算法
前面我们学习了插入排序、希尔排序 选择排序 、堆排序 、冒泡排序、快速排序以及归并排序
这些排序都可以在内存中进行排序,不同的是合并排序也可以在磁盘中排序,
怎么在磁盘上排序呢。假设内存只有1G,一个文件里有4G的数据,我们可以通过把这个数据分成4份,每一份我们可以在内存中进行排序,排序好任何写入回去, 然后通过归并排序进行排序好
排序算法--------计数排序,排序算法,算法
分配好的每部分先用计数排序进行排序好

计数排序

思路:
遍历一便这个文件数据,统计好这些数值出现的次数,创建一个数组
排序算法--------计数排序,排序算法,算法
绝对映射:
找到里面的最大值,以最大值为这个数组的空间,这样很容易造成空间的浪费。
相对映射:
我们可以通过找出其中的最大最小进行相减然后加1,获取到要开辟的大小
排序算法--------计数排序,排序算法,算法
我们对每个原数组的元素减去min,然后找到对应的下标的值加1

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
void CountSort(int* a, int size)
{
	int min = INT_MAX;
	int max = INT_MIN;
	int i = 0;
	//找最大和最小
	for (i = 0; i < size; i++)
	{
		max = (a[i] > max ? a[i] : max);
		min = (a[i] < min ? a[i] : min);
	}
	int range = max - min + 1;
	int* newnum = (int*)calloc(range,sizeof(int));
	//开始计数
	for (i = 0; i < size; i++)
	{
		int num = a[i] - min;
		newnum[num]++;
	}
	//开始往原数组覆盖
	for (i = 0; i < range; i++)
	{
		static int j = 0;
		while (newnum[i]--)
		{
			a[j++] = i + min;
		}
	}
	free(newnum);

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

计数排序的优缺点

1.时间复杂度是O(N+ range),要看N和range哪个大
2.适合于整形,且数值相对集中,比如a[10] = {1,200,999999}这个就不能使用了

文章来源地址https://www.toymoban.com/news/detail-771696.html

到了这里,关于排序算法--------计数排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 十大排序算法(下):计数排序,基数排序,桶排序

    有n个数,取值范围是 0~n,写出一个排序算法,要求时间复杂度和空间复杂度都是O(n)的 我们知道,前面介绍的基于比较的排序算法中,最好的算法,其平均时间复杂度都在O(N),达到线性的时间复杂度就要使用新的排序算法,而这种方法,就称为是计数排序。 计数排序的思路

    2024年02月05日
    浏览(25)
  • 深入浅出排序算法之计数排序

    目录 1. 原理 2. 代码实现 3. 性能分析 首先看一个题目,有n个数,取值范围是 0~n,写出一个排序算法,要求时间复杂度和空间复杂度都是O(n)的。 为了达到这种效果,这一篇将会介绍一种 不基于比较的排序方法。 这种方法被称为计数排序。 计数排序的思路是这样的,对于每

    2024年02月06日
    浏览(26)
  • 数据结构与算法—归并排序&计数排序

    目录 一、归并排序 1、主函数 2、递归实现 3、优化递归  4、非递归实现 5、特性总结: 二、计数排序 1、代码: 2、特性总结: 三、各种排序总结 时间空间复杂度汇总  基本思想: 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用 分治法 的一个非常典型的

    2024年02月04日
    浏览(32)
  • 【排序算法】 计数排序(非比较排序)详解!了解哈希思想!

    🎥 屿小夏 : 个人主页 🔥个人专栏 : 算法—排序篇 🌄 莫道桑榆晚,为霞尚满天! 什么是计数排序?计数排序的思想是什么?它是如何实现的? 本文会对计数排序进行由浅入深的探究,让你彻底掌握计数排序! ​ 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应

    2024年02月06日
    浏览(30)
  • 【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.冒泡排序 2.快速排序 2.1Hoare版 2.2占坑版 2.3前后指针版 2.4三数取中对快速排序的优化 2.5非递归版 3.归

    2024年02月08日
    浏览(35)
  • 【计数排序算法思想及其应用】

    本文主要介绍Java中计数排序(Counting Sort)算法的基本原理、实现方式以及使用场景。计数排序是一种线性时间复杂度的非比较排序算法,通过计数数组来统计输入数据中每个元素出现的次数,然后按照数组下标顺序输出排序后的结果。本文将深入剖析计数排序的思想及其在

    2024年02月07日
    浏览(40)
  • ①归并排序、快速排序 、堆排序、计数排序[算法、代码模板、面试题]

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ ⚪步骤 归并排序 : 归并排序是一种分治法(Divide and Conquer)的经典排序算法,它的基本思想是将原始数组

    2024年02月04日
    浏览(33)
  • 快排(非递归)及计数排序算法

    都学了递归版的快速排序为何还要再学非递归实现?由于在递归过程中,如果数据量过大,那么实现时容易导致栈溢出,虽然代码没有问题,但是就是会崩,因此要将其改为非递归来实现 如何做到将递归算法改为非递归算法? 简单的递归可以直接将其改为循环(如斐波那契

    2023年04月17日
    浏览(33)
  • 【基础算法】八大排序算法:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排),归并排序,计数排序

      🧑‍🎓 个人主页:简 料   🏆 所属专栏:C++   🏆 个人社区:越努力越幸运社区   🏆 简       介: 简料简料,简单有料~在校大学生一枚,专注C/C++/GO的干货分享,立志成为您的好帮手 ~ C/C++学习路线 (点击解锁) ❤️ C语言阶段(已结束) ❤️ 数据结构与算法(ing) ❤

    2024年02月01日
    浏览(34)
  • 数据结构与算法之排序: 计数排序 (Javascript版)

    排序 排序:把某个乱序的数组变成升序或降序的数组 (这里用数组来做举例) 计数排序 核心思想 :通过计数而非比较来进行排序,借助数组下标本身就是有序的原理实现 适用范围:较小的非负整数序列和最小值和最大值之间的数字范围比较合适 基数排序需要新增一个计数数

    2024年02月06日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包