当前位置: 首页 > news >正文

排序算法---计数排序

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

计数排序(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[],完成排序。

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

相关文章:

  • 安全基础~通用漏洞5
  • 【Spring2】从重构HelloWorld看Spring的作用
  • 面试经典150题——最小覆盖子串(困难)
  • 微信小程序(四十一)wechat-http的使用
  • Java解决下降路径最小和
  • C++数据结构与算法——双指针法
  • BatchNorm介绍:卷积神经网络中的BN
  • 鸿蒙系统优缺点,能否作为开发者选择
  • MySQL 基础知识(八)之用户权限管理
  • C#,21根火柴棍问题(21 Matchticks Problem)的算法与源代码
  • Netty Review - NioEventLoopGroup源码解析
  • 《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)
  • uniapp 开发一个密码管理app
  • Python四级考试笔记
  • 【Linux】vim的基本操作与配置(下)
  • html从零开始9:javaScript简介,语句、标识符,变量,JavaScript引入到文件【搬代码】
  • 高级前端面试题及详解
  • 打印最小公倍数
  • linux安装mysql8且初始化表名忽略大小写
  • 【微信小程序】微信小程序开发:从入门到精通
  • 新华时评:防范安全事故须臾不可放松
  • 剑指3000亿产业规模,机器人“武林大会”背后的无锡“野望”
  • 国务院安委办、应急管理部进一步调度部署“五一”假期安全防范工作
  • 神舟十九号载人飞行任务取得圆满成功
  • 国家能源局通报上月投诉情况:赤峰有群众反映电费异常增高,已退费
  • 国泰海通合并后首份业绩报告出炉:一季度净利润增逾391%