C++计数排序详解

yizhihongxing

C++计数排序详解

什么是计数排序?

计数排序是一种非比较型排序算法,它的基本思想是统计所有元素的出现次数,然后根据每个元素的出现次数,依次将这些元素放入数组中,从而得到排好序的数组。

计数排序的基本原理

计数排序利用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素个数。然后根据数组C来将A中的元素排到正确的位置。例如,如果C[3]=4,那么值等于3的元素就该排在第5个位置,因为之前有4个元素小于它。

计数排序的实现步骤

void countSort(int arr[], int n) {
    int maxElement = *max_element(arr, arr + n);  // 找出待排序数组中的最大值
    int count[maxElement + 1]{0};                  // 创建count数组, 初始化元素都为0
    int sortedArray[n];                            // 创建排序后的数组sortedArray

    // 计算待排序数组中每个元素出现的个数,并记录在count数组中
    for(int i = 0; i < n; i++) {
        count[arr[i]]++;
    }

    // 计算每个元素在排序后的数组中应该出现的位置
    for(int i = 1; i <= maxElement; i++) {
        count[i] += count[i - 1];
    }

    // 将待排序数组中的元素按照count数组中的计数放入排序后的数组sortedArray中
    for(int i = 0; i < n; i++) {
        sortedArray[count[arr[i]] - 1] = arr[i];
        count[arr[i]]--;
    }

    // 将排序后的数组拷贝回原数组
    copy(sortedArray, sortedArray + n, arr);
}

计数排序的示例

示例一

假设有一个待排序数组arr[] = {5, 6, 2, 3, 8, 6, 9, 1, 3},则计数排序的执行过程如下:

  1. 找出待排序数组中的最大值,为9,创建count数组,共有10个元素,全部初始化为0。
  2. 将待排序数组中每个元素出现的个数计算出来,并记录在count数组中,结果如下:
0 1 2 3 4 5 6 7 8 9
count数组中的元素个数 0 1 1 2 0 1 2 0 1 1
  1. 计算每个元素在排序后的数组中应该出现的位置,并记录在count数组中,现在count数组中的元素值为:
0 1 2 3 4 5 6 7 8 9
count数组中的元素个数 0 1 2 4 4 5 7 7 8 9
  1. 将待排序数组中的元素按照count数组中的计数,放入排序后的数组sortedArray中,现在sortedArray数组中的元素值为:
位置 0 1 2 3 4 5 6 7 8
元素 1 2 3 3 5 6 6 8 9
  1. 将排序后的数组拷贝回原数组arr[]中,得到的排序结果为:arr[] = {1, 2, 3, 3, 5, 6, 6, 8, 9}.

示例二

假设有一个待排序数组arr[] = {3, 4, 5, 2, 6, 3, 9, 1, 10, 8},则计数排序的执行过程如下:

  1. 找出待排序数组中的最大值,为10,创建count数组,共有11个元素,全部初始化为0。
  2. 将待排序数组中每个元素出现的个数计算出来,并记录在count数组中,结果如下:
0 1 2 3 4 5 6 7 8 9 10
count数组中的元素个数 0 1 1 2 1 1 1 0 1 0 1
  1. 计算每个元素在排序后的数组中应该出现的位置,并记录在count数组中,现在count数组中的元素值为:
0 1 2 3 4 5 6 7 8 9 10
count数组中的元素个数 0 1 2 4 5 6 7 8 9 9 10
  1. 将待排序数组中的元素按照count数组中的计数,放入排序后的数组sortedArray中,现在sortedArray数组中的元素值为:
位置 0 1 2 3 4 5 6 7 8 9
元素 1 2 3 3 4 5 6 8 9 10
  1. 将排序后的数组拷贝回原数组arr[]中,得到的排序结果为:arr[] = {1, 2, 3, 3, 4, 5, 6, 8, 9, 10}.

总结

计数排序是一种简单而高效的排序算法,它的时间复杂度为O(n+k),其中n为待排序数组的大小,k为待排序数组中最大值的大小。虽然计数排序的适用场景比较有限,但在一些特定的应用场景(例如待排序数组是小范围整数的情况下),计数排序能够达到很高的排序效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++计数排序详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C语言编程入门之程序头文件的简要解析

    C语言编程入门之程序头文件的简要解析 什么是头文件 头文件(Header Files)通常是一些包含函数定义、变量声明等的文本文件,其内容可以被多个源文件引用(#include)以便让其内部定义的函数和变量可以在引用这个头文件的源文件中被使用。 头文件的分类 头文件可以分为两类: 1. 系统头文件 系统头文件是由编译器提供的,主要包含一些常用的函数库、数据类…

    C 2023年5月23日
    00
  • 使用批处理异地备份数据(winrar)

    下面我将详细讲解如何使用批处理异地备份数据(winrar)。 1. 准备工作 在使用批处理进行异地备份之前,需要先下载安装 WinRAR 软件,并确保已经设置好环境变量。同时需要确定好备份的目录和备份的目标路径。 2. 编写批处理脚本 我们可以使用 notepad 或者其他文本编辑器来编写批处理脚本。打开文本编辑器,输入如下代码: @echo off set…

    C 2023年5月22日
    00
  • C++类中如何使用定义的类型别名

    在C++中,我们可以使用typedef或using关键字来定义类型别名。然后,我们可以在类中使用定义好的类型别名,以方便代码的编写和维护。 以下是使用typedef关键字在类中定义和使用类型别名的示例: typedef int myInt; class MyClass { public: void setNum(myInt num) { m_num = nu…

    C 2023年5月23日
    00
  • Firebug 字幕文件JSON地址获取代码

    下面是“Firebug 字幕文件JSON地址获取代码”的完整攻略。 一、背景介绍 Firebug是一款非常强大的浏览器调试工具,它可以帮助开发者在开发过程中进行代码审查、JS调试、修改CSS等功能。Firebug具有很多的扩展插件,其中之一就是Firecaption,可以帮助用户获取电影字幕文件JSON地址。本攻略主要讲解Firecaption的使用方法。 …

    C 2023年5月23日
    00
  • JVM调优OutOfMemoryError异常分析

    针对JVM调优OutOfMemoryError异常分析,我可以给出以下完整攻略: 步骤一:复现错误 首先,我们需要尝试复现”OutOfMemoryError”异常,以便分析与解决问题。可以使用压力测试或者其他方式使程序运行仅几分钟便出现该异常。 步骤二:查看error日志 当异常发生时,JVM会在控制台或日志中输出相关信息,我们需要查看并分析这些日志。此时,…

    C 2023年5月23日
    00
  • python中解析json格式文件的方法示例

    关于“python中解析json格式文件的方法示例”的攻略,我来详细讲解一下。 什么是JSON格式文件 首先,我们需要了解一下什么是JSON格式文件。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于阅读和编写。它基于JavaScript的一个子集,表示为对象(object),属性(key)和值(value)的集…

    C 2023年5月23日
    00
  • C++的替代:微软如何使用rust?

    C++的替代:微软如何使用Rust? Rust是一种系统级编程语言,它被称为C++的替代。它具有C++的高效和灵活性,同时也提供了强大的类型安全和内存安全保证。Microsoft正在积极使用Rust,以替代一些关键系统组件的底层编程语言。 使用Rust的原因 Microsoft决定使用Rust的主要原因是Rust的内存安全保证。内存相关的漏洞是造成系统崩溃和…

    C 2023年5月23日
    00
  • JS跨域交互(jQuery+php)之jsonp使用心得

    下面我为你讲解一下“JS跨域交互(jQuery+php)之jsonp使用心得”的完整攻略。 什么是跨域? 跨域(cross-origin)是指在当前请求资源(如 javascript、css、json、xml 等)的文档或脚本所属窗口(window、iframe 或 frame)与请求资源所在文档的域(domain)不同情况下的访问。 JSONP 原理 JS…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部