C++ 计数排序实例详解

C++ 计数排序实例详解

简介

计数排序是一种稳定的排序算法,其时间复杂度为O(n + k),其中n为待排序序列的长度,k为序列中元素的取值范围。相比其他排序算法,计数排序的时间复杂度较小,但需要占用更多的内存空间。计数排序在排序的元素值比较小,且元素集合密集程度比较大的场景下表现更加出色。

算法原理

计数排序的基本思想是,统计待排序序列中,每个元素出现的个数,并将其记录在计数数组中。然后,根据计数数组中统计到的元素出现个数,依次重构有序序列。

具体过程如下:
1. 统计待排序序列元素的个数,将其存放在计数数组中(计数数组大小为待排序序列中元素的取值范围)。
2. 计算计数数组中的累加和,用于计算每个元素在有序序列中的位置。
3. 依次遍历待排序序列,将每个元素根据其在计数数组中所对应的位置,依次放入有序序列中,并将其对应的计数数组位置上的元素值减1。

C++代码实现

#include <iostream>
#include <cstring>

using namespace std;

void CountingSort(int arr[], int n)
{
    int k = arr[0];
    for(int i = 1; i < n; i++)
    {
        if(k < arr[i])
        {
            k = arr[i];
        }
    }

    int* count = new int[k + 1];
    memset(count, 0, sizeof(int) * (k + 1));

    for(int i = 0; i < n; i++)
    {
        count[arr[i]]++;
    }

    for(int i = 1; i <= k; i++)
    {
        count[i] += count[i - 1];
    }

    int* sorted = new int[n];
    for(int i = n - 1; i >= 0; i--)
    {
        sorted[--count[arr[i]]] = arr[i];
    }

    for(int i = 0; i < n; i++)
    {
        arr[i] = sorted[i];
    }

    delete[] count;
    delete[] sorted;
}

int main()
{
    int arr1[] = {3, 4, 1, 7, 6, 5, 8, 9, 2, 10};
    int n1 = sizeof(arr1) / sizeof(int);
    CountingSort(arr1, n1);
    for(int i = 0; i < n1; i++)
    {
        cout << arr1[i] << " ";
    }
    cout << endl;

    int arr2[] = {5, 3, 7, 2, 8, 4, 9, 1, 6};
    int n2 = sizeof(arr2) / sizeof(int);
    CountingSort(arr2, n2);
    for(int i = 0; i < n2; i++)
    {
        cout << arr2[i] << " ";
    }
    cout << endl;

    return 0;
}

示例说明

示例一

输入:

int arr1[] = {3, 4, 1, 7, 6, 5, 8, 9, 2, 10};
int n1 = sizeof(arr1) / sizeof(int);
CountingSort(arr1, n1);

输出:

1 2 3 4 5 6 7 8 9 10

示例二

输入:

int arr2[] = {5, 3, 7, 2, 8, 4, 9, 1, 6};
int n2 = sizeof(arr2) / sizeof(int);
CountingSort(arr2, n2);

输出:

1 2 3 4 5 6 7 8 9

以上两个示例分别演示了计数排序的过程,验证了该算法的正确性。

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

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

相关文章

  • MybatisPlus中的insert操作详解

    MybatisPlus 是 MyBatis 的增强工具包,可以极大地简化 MyBatis 的操作。其中包括许多基础操作,例如insert、update、delete、select等操作。在这里,我们将详细讲解 MybatisPlus 中的 insert 操作。 什么是 MybatisPlus 中的 insert 操作? MybatisPlus 中的 inse…

    算法与数据结构 2023年5月19日
    00
  • JS常见面试试题总结【去重、遍历、闭包、继承等】

    来讲解一下“JS常见面试试题总结【去重、遍历、闭包、继承等】”的完整攻略。 一、去重 JS中去重的方法有很多种,我这里介绍两种比较常见的方法。 1.1 利用Set去重 let arr = [1, 2, 3, 1, 2, 3]; let unique = […new Set(arr)]; console.log(unique); // [1, 2, 3] …

    算法与数据结构 2023年5月19日
    00
  • JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】

    JS前端面试必备——基本排序算法原理与实现方法详解 在前端面试中,算法是一个必考的考点,掌握一些基本的排序算法对于一个前端工程师来说是非常重要的。 排序算法的分类 排序算法可以按照许多不同的标准进行分类: 平均时间复杂度 空间复杂度 稳定性 内部排序和外部排序 在这篇文章中,我们将按照时间复杂度从小到大的顺序介绍以下五个基本的排序算法:插入排序、选择排序、归…

    算法与数据结构 2023年5月19日
    00
  • 基于python进行桶排序与基数排序的总结

    基于python进行桶排序与基数排序的总结 桶排序 桶排序是一种稳定的排序算法,利用预先定义的桶按照一定的映射关系将待排序的元素分配到不同的桶中,并对每个桶中的元素进行排序,最后将所有桶中的结果合并起来即可。 具体的步骤如下: 找出待排序数组中的最大值max和最小值min,确定所需桶的数量,建立一个包含顺序桶的桶(列表)bucket和一个空列表result。…

    算法与数据结构 2023年5月19日
    00
  • C语言 冒泡排序算法详解及实例

    冒泡排序算法详解及实例 什么是冒泡排序算法 冒泡排序是一种很基础的排序算法,它通过从序列的一端开始,依次比较相邻两个元素的大小,如果它们的顺序不对,就交换它们的位置,直到把整个序列排序完成。冒泡排序算法的时间复杂度为O(n^2),所以它并不适合排序规模很大的序列。 冒泡排序算法的实现 冒泡排序算法的实现很简单,其核心代码如下: void bubble_sor…

    算法与数据结构 2023年5月19日
    00
  • Java分治归并排序算法实例详解

    Java分治归并排序算法实例详解 什么是分治归并排序算法 分治法是一种算法解决问题的思想,即将一个问题分成若干个小问题,再将小问题分成更小的子问题,直到最后子问题可以很容易地直接求解,原问题的解即子问题的解的合并。归并排序算法采用了分治法思想,将一个要排序的数组分成两个小数组,再将这两个小数组分别排序,最终合并两个有序小数组成为一个有序大数组。 算法流程 分…

    算法与数据结构 2023年5月19日
    00
  • PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)

    当我们需要进行字符串比较时,通常会使用PHP中的strcmp()函数。但是,如果比较的字符串中包含数字,则会出现问题。举个例子,如果我们将”file9.txt”和”file10.txt”进行比较,strcmp()函数会认为”file10.txt”小于”file9.txt”,因为在ASCII码中,数字1比数字9要小。 为了解决这个问题,PHP提供了一个自然排序…

    算法与数据结构 2023年5月19日
    00
  • C语言直接选择排序算法详解

    C语言直接选择排序算法详解 什么是选择排序算法 选择排序算法(Selection Sort)是一种简单直观的排序算法。该算法每次从未排序的数中选择最小(或最大)的一个数,将其放在已排序数列的末尾,直到所有数排序完成。因为该算法在每次排序后的下一轮排序不会再考虑之前选择的最小(或最大)值,所以属于不稳定排序算法。 算法流程 选择排序算法主要分为两个步骤: 在未…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部