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 标准库 time.h

    time.h 是 C 标准库中的一个头文件,它提供了一系列函数来操作日期和时间。下面我们来详细讲解如何使用 time.h 标准库。 时间表示法 在 time.h 中,通常使用 time_t 类型来表示时间戳(timestamp),即表示从 1970 年 1 月 1 日 0 时 0 分 0 秒到某一个时间点所经过的秒数。时间戳可以用 time() 函数获取。 …

    C 2023年5月10日
    00
  • 如何修复错误0xC1900101?Win11安装助手错误代码0xc1900101的原因以及解决方法

    接下来我将详细讲解一下如何修复错误0xC1900101以及Win11安装助手错误代码0xc1900101的原因以及解决方法。 什么是错误0xC1900101? 错误0xC1900101是在Windows 10或Windows 11升级时通常发生的一种错误。这个错误通常表示升级过程出现了某种问题,导致升级无法完成。具体来讲,错误0xC1900101表示在升级过…

    C 2023年5月23日
    00
  • win7系统提示Explorer.exe应用程序错误0xc0000142错误窗口的三种解决方法

    下面我介绍一下“win7系统提示Explorer.exe应用程序错误0xc0000142错误窗口的三种解决方法”。 问题描述 在win7系统中,当我们打开Windows资源管理器时,有时会遇到“Explorer.exe应用程序错误0xc0000142”窗口的提示。这个错误提示窗口会阻止我们正常使用资源管理器,造成很大的不便。 解决方法 出现该错误窗口时,可以…

    C 2023年5月23日
    00
  • C语言计算代码执行所耗CPU时钟周期

    计算C语言代码执行所耗CPU时钟周期的攻略 在计算C语言代码执行所耗CPU时钟周期之前,需要我们先了解几个概念。 CPU时钟周期 CPU时钟周期是CPU进行一次基本操作所需的时间,通常用纳秒(ns)作为单位进行计量。CPU的时钟频率越高,单位时间内可处理的指令条数就越多,因此计算机越快。 CPU时钟周期与指令执行周期 CPU时钟周期和指令执行周期是两个不同的…

    C 2023年5月23日
    00
  • PHP JSON格式的中文显示问题解决方法

    PHP 中 JSON 格式对于中文字符的处理方式存在一些问题,下面提供一种解决方法。 问题分析 在使用 PHP 中的 json_encode 函数将一个数组或对象转换为 JSON 字符串时,如果数组或对象中含有中文字符,那么生成的 JSON 字符串中这些中文字符会被转义成 Unicode 编码形式。 例如,以下数组: $data = [ "name…

    C 2023年5月23日
    00
  • C程序 将以英寸-英尺为单位的N个距离相加

    可以使用以下步骤完成C程序 将以英寸-英尺为单位的N个距离相加: 步骤一:定义距离变量和变量总数 首先需要定义变量来保存距离和距离总数,可以使用float类型来保存距离,int类型来保存距离总数,例如: int n; // 距离总数 float distance; // 单位为英尺或英寸的距离 步骤二:输入距离 使用循环结构来输入所有距离,例如: for(i…

    C 2023年5月9日
    00
  • C语言 字符串指针详解及示例代码

    C语言 字符串指针详解及示例代码 什么是字符串指针? 在C语言中,字符串指针通常用来存储字符串的地址,字符串指针变量以及字符串变量有所不同:字符串变量是进行字符串内容及长度操作的,而字符串指针变量不同,它仅存储字符串的地址,这意味着字符串指针变量可以指向不同的字符串。 字符串指针变量的声明方式: char *stringPointer; 字符串指针的赋值 字…

    C 2023年5月24日
    00
  • vscode插件设置之Golang开发环境配置全过程

    VS Code插件设置之Golang开发环境配置全过程 为什么需要配置Golang开发环境 Golang 是一种高效、可靠、快速和简单的编程语言,适用于Web开发以及云计算领域等。 在进行Golang项目开发时,需要搭建相应的开发环境,其中包括对Golang语言的了解,安装Golang编译器、配置编译器环境等。本文将为大家讲解VS Code插件设置之Gola…

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