C++计数排序详解

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语言10个经典小程序

    下面是对“C语言10个经典小程序”的详细讲解,主要包括以下内容: 概述 经典小程序列表 完整攻略 示例说明 1. 概述 “C语言10个经典小程序”是一个非常有名的程序集,它包含了许多经典的C语言小程序。这些小程序都具有简单、实用、易于理解等特点,非常适合初学者学习和实践。 2. 经典小程序列表 计算n个整数的平均值 求解一元二次方程的根 按照ASCII码顺序…

    C 2023年5月24日
    00
  • 纯C语言实现火车售票系统

    纯C语言实现火车售票系统攻略 1. 确定基本模块和程序框架 1.1 基本模块 一个火车售票系统需要考虑以下基本模块: 车站信息模块:用于储存和查询车站信息,包括车站编号、车站名称等; 车次信息模块:用于储存和查询车次信息,包括车次编号、起点站、终点站、发车时间等; 座位信息模块:用于储存和查询座位信息,包括座位号、所在车次、票价等; 订单信息模块:用于储存和…

    C 2023年5月23日
    00
  • 从C++单例模式到线程安全详解

    从C++单例模式到线程安全详解 什么是单例模式 单例模式是一种设计模式,它允许一个类只创建一个实例,同时提供一个访问该实例的全局节点。这种模式常用于控制特定资源的访问,如数据库或者网络连接。 C++实现单例模式 在C++中,实现单例模式最常用的方法是使用静态成员变量和私有构造函数。具体实现步骤如下:1. 将类的构造函数设置为私有。2. 在类中定义一个静态私有…

    C 2023年5月22日
    00
  • C语言文件操作的入门详解教程

    C语言文件操作的入门详解教程 在C语言程序中,文件操作是一项非常重要的技能。文件操作可以让程序读取和写入文件内容,将程序的输入和输出保存在文件中,实现文件的创建、读取、写入和删除等操作。本教程将从基本概念和语法讲解开始,深入介绍C语言文件操作的方法和技巧,旨在帮助初学者快速上手,并能完成各种文件操作任务。 1.文件操作基础 在C语言中,文件操作有两种基本方式…

    C 2023年5月23日
    00
  • 如何使用bindgen将C语言头文件转换为Rust接口代码

    当我们想要在Rust中使用C语言编写的库时,我们需要将C语言的头文件转换为Rust代码。这时候,我们可以使用Bindgen工具,它可以根据C语言的头文件生成Rust代码,省去了手动编写Rust代码的麻烦。本文将详细介绍如何使用Bindgen将C语言头文件转换为Rust代码。 安装Bindgen 首先需要安装Bindgen工具,我们可以使用以下命令进行安装: …

    C 2023年5月23日
    00
  • javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 解决方法总结

    首先,这个错误是由于JDK 8及以上版本中的加密协议更新导致的。要解决这个问题,有两种方法可以尝试。 方法1:强制使用TLSv1协议 这个方法非常简单,只需要在程序中强制使用TLSv1协议即可,特别是对于需要与老版本的服务器进行交互的情况,更是非常适用。 在使用HttpsURLConnection类时,可以通过如下代码强制使用TLSv1协议: System.…

    C 2023年5月22日
    00
  • 华硕a40jc装windows8 64位系统装完显卡驱动重启无法进入系统

    华硕a40jc是一款较老的笔记本电脑,它的显卡是NVIDIA GeForce 310M。在安装Windows 8 64位系统并安装显卡驱动后出现无法进入系统的问题,可能与显卡驱动版本不兼容或者未完全卸载旧版显卡驱动有关。以下是详细的攻略: 问题现象 安装Windows 8 64位系统后,安装NVIDIA GeForce 310M显卡驱动; 重启电脑后,系统无…

    C 2023年5月24日
    00
  • C++编译期循环获取变量类型详情

    下面我将为您详细讲解 C++ 编译期循环获取变量类型的完整攻略。 什么是编译期循环获取变量类型? 在 C++ 中,有时候我们需要获取一个集合中特定元素的类型,如果使用运行时的方法获取,需要使用运行时类型信息(RTTI)机制,速度较慢。而编译期循环获取变量类型则是一种优雅的方式,它可以在编译的时候直接获取到想要的类型信息,更加高效。 如何实现编译期循环获取变量…

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