排序算法---计数排序

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

原创不易,转载请注明出处。欢迎点赞收藏~

计数排序(Counting Sort)是一种线性时间复杂度的排序算法,其核心思想是通过统计待排序元素的个数来确定元素的相对位置,从而实现排序。

具体的计数排序算法步骤如下:
1. 找出待排序数组中的最大值,并创建一个统计数组count[],其长度为最大值加1。
2. 遍历待排序数组,统计每个元素出现的次数,将统计结果存储在count[]数组中。count[i]表示元素i出现的次数。
3. 对count[]数组进行累加,得到每个元素在排序后的数组中的最后一个位置。即count[i]表示小于等于元素i的元素个数。
4. 创建一个临时数组temp[],其长度与待排序数组相同。
5. 逆序遍历待排序数组,根据count[]数组中的记录,将每个元素放入temp[]数组中的正确位置。
6. 将temp[]数组的元素复制回待排序数组,完成排序。

计数排序的时间复杂度为O(n+k),其中n是待排序数组的长度,k是待排序数组中的最大值。由于需要创建额外的count[]和temp[]数组,所以空间复杂度为O(n+k)。

需要注意的是,计数排序适用于元素范围较小且非负整数的排序,如果待排序数组包含负数或者小数,则需要进行适当的转换或调整。计数排序是稳定的排序算法,因为相同元素的相对顺序在排序后保持不变,但它不是基于比较的排序算法,因此在某些情况下比其他排序算法更高效。

下面是一个使用C语言实现的计数排序示例:

#include <stdio.h>

void counting_sort(int arr[], int n)
{
    int max = arr[0];

    // 找出最大值
    for (int i = 1; i < n; i++)
    {
        if (arr[i] > max)
        {
            max = arr[i];
        }
    }

    // 创建统计数组count[],并初始化为0
    int count[max + 1];
    for (int i = 0; i <= max; i++)
    {
        count[i] = 0;
    }

    // 统计每个元素的次数
    for (int i = 0; i < n; i++)
    {
        count[arr[i]]++;
    }

    // 累加count[]数组,表示小于等于元素i的元素个数
    for (int i = 1; i <= max; i++)
    {
        count[i] += count[i - 1];
    }

    // 创建临时数组temp[],存储排好序的元素
    int temp[n];

    // 根据count[]数组中的记录,将元素放入temp[]数组的正确位置
    for (int i = n - 1; i >= 0; i--)
    {
        temp[count[arr[i]] - 1] = arr[i];
        count[arr[i]]--;
    }

    // 将temp[]数组的元素复制回原数组arr[]
    for (int i = 0; i < n; i++)
    {
        arr[i] = temp[i];
    }
}

int main()
{
    int arr[] = {9, 3, 6, 1, 3, 2, 9, 0};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("排序前的数组:\n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }

    counting_sort(arr, n);

    printf("\n排序后的数组: \n");
    for (int i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);
    }
    putchar('\n');

    return 0;
}

这段代码实现了计数排序算法。主要包括以下步骤:

1.遍历数组找出最大值,确定统计数组count[]的长度。
2.创建并初始化统计数组count[],长度为最大值加1。
3.遍历数组,统计每个元素的出现次数,存储在count[]中。
4.累加count[]数组,表示小于等于元素i的元素个数。
5.创建临时数组temp[],用于存储排好序的元素。
6.逆序遍历原数组,根据count[]数组中的记录,将元素放入temp[]数组的正确位置。
7.将temp[]数组的元素复制回原数组arr[],完成排序。

运行如上代码,你可以看到以下输出:

排序算法---计数排序,排序算法,排序算法,算法,数据结构文章来源地址https://www.toymoban.com/news/detail-831758.html

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

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

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

相关文章

  • 【数据结构与算法】万字剖析八大排序(直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序)

    【数据结构与算法】万字剖析八大排序(直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序)

    初窥直接插入排序我们先来看一张动图: 由动图我们可以分析出直接插入排序是从 第二个数据开始遍历 ,与 前面的数据进行比较 如果小于 则让前面的数据向前移动 自己接着向前面的数据比较 直到比较到 大于等于自己的 数据或者 没有数据能进行比较 时停止 插入当前的位

    2023年04月13日
    浏览(47)
  • 【数据结构】——归并排序和计数排序

    【数据结构】——归并排序和计数排序

    🌇个人主页:_麦麦_ 📚今日名言:繁华落尽,我心中仍有花落的声音。一朵,一朵,在无人的山间轻轻飘落。——席慕蓉《桐花》 目录 一、前言 二、正文 1.归并排序 1.1 基本思想 1.2【递归版】具体实现  1.3【递归版】代码部分  1.4【非递归版】具体实现  1.5【非递归版】

    2023年04月15日
    浏览(12)
  • 【数据结构】排序之归并排序与计数排序

    【数据结构】排序之归并排序与计数排序

    个人主页 : zxctsclrjjjcph 文章封面来自:艺术家–贤海林 如有转载请先通知 在前面的文章中介绍了 插入排序和交换排序,今天来分享的是归并排序和计数排序。 话不多说,正文开始。 归并排序既是内排序也是外排序。 基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的

    2024年01月17日
    浏览(12)
  • 【数据结构】-计数排序

    【数据结构】-计数排序

    🎇作者:小树苗渴望变成参天大树 🎉 作者宣言:认真写好每一篇博客 🎊作者gitee:link 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! 答应大家的计数排序今天它来了,这也是一个非常巧妙的方法,不通过比较元素的大小就可以排序出来,通过用另一个人数组

    2023年04月17日
    浏览(9)
  • 数据结构——归并排序和计数排序的介绍

    数据结构——归并排序和计数排序的介绍

    归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列。即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

    2024年02月11日
    浏览(8)
  • 数据结构——lesson13排序之计数排序

    数据结构——lesson13排序之计数排序

    hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥 个人主页:大耳朵土土垚的博客 💥 所属专栏:数据结构学习笔记 、排序算法合集 💥对于数据结构顺序表、链表、堆以及排序有疑问的都可以在上面数据结构专栏和排序合集专栏进行

    2024年04月10日
    浏览(13)
  • 【数据结构初阶】八大排序(三)——归并排序&&计数排序

    【数据结构初阶】八大排序(三)——归并排序&&计数排序

    大家好我是沐曦希💕 往期博客:【数据结构初阶】八大排序(一)——希尔排序堆排序直接插入排序直接选择排序 【数据结构初阶】八大排序(二)——快速排序冒泡排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一

    2024年02月03日
    浏览(46)
  • 【C语言】数据结构——排序三(归并与计数排序)

    【C语言】数据结构——排序三(归并与计数排序)

    💗个人主页💗 ⭐个人专栏——数据结构学习⭐ 💫点击关注🤩一起学习C语言💯💫 我们在前面学习了排序,包括直接插入排序,希尔排序,选择排序,堆排序,冒泡排序和快排。 今天我们来讲一讲归并排序和计数排序。 关注博主或是订阅专栏,掌握第一消息。 归并排序的

    2024年01月19日
    浏览(15)
  • 【数据结构】归并排序的两种实现方式与计数排序

    【数据结构】归并排序的两种实现方式与计数排序

    前言:在前面我们讲了各种常见的排序,今天我们就来对排序部分收个尾,再来对归并排序通过递归和非递归的方法进行实现,与对计数排序进行简单的学习。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:数据结构 👈 💯代码仓库:卫卫周大胖的学习日记💫 💪关注博

    2024年01月18日
    浏览(14)
  • 数据结构:排序干货!(7大排序汇总+快速排序的优化+计数排序+基数排序+桶排序)

    数据结构:排序干货!(7大排序汇总+快速排序的优化+计数排序+基数排序+桶排序)

    目录 概念 插入排序 直接插入排序 希尔排序 选择排序 直接选择排序 双向选择排序 堆排序 交换排序 冒泡排序 快速排序 Hoare法 挖坑法 前后指针法 快排的优化 三数取中法 非递归快排 归并排序 分治算法+二路归并 非递归归并 应用 排序总结 其他排序 计数排序 简单版本 复杂

    2024年02月06日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包