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日

相关文章

  • C++实现快速排序(Quicksort)算法

    C++实现快速排序(Quicksort)算法 快速排序(Quicksort)算法是一种常见的排序算法,具有快速、高效、稳定性好等特点,广泛应用于各种工程实践中。 快速排序的基本思想 快速排序的基本思想是:选取一个基准值(pivot),将待排序序列划分成左右两个子序列,左边的子序列中所有元素都不大于基准值,右边的子序列中所有元素都不小于基准值,然后对左右两个子…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法系列之直接选择排序详解

    PHP排序算法系列之直接选择排序详解 一、前言 本文将详细讲解直接选择排序,直接选择排序是一个简单但常用的排序算法,对初学者来说是个很好的入门算法,代码也比较易懂。 二、算法原理 直接选择排序,是一种比较简单直观的排序算法。其基本思想为:将待排序的序列划分为已排序和未排序两部分,从未排序的序列中选择最小的元素,将其插入已排序序列的末尾,直到所有元素均排序完毕…

    算法与数据结构 2023年5月19日
    00
  • C语言详细讲解qsort函数的使用

    C语言详细讲解qsort函数的使用 qsort函数简介 在C语言中,qsort函数是一个标准库函数,用于将一个数组排序。它使用快速排序算法,实现了高效的排序。qsort函数的原型定义如下: void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void…

    算法与数据结构 2023年5月19日
    00
  • redis zset实现滑动窗口限流的代码

    Redis ZSET(有序集合)非常适合实现滑动窗口限流。下面是实现滑动窗口限流的Redis ZSET代码攻略: 步骤一:定义一个键和窗口大小 为了使用Redis ZSET实现滑动窗口限流,您需要为每个限流器定义一个键。键的值将存储在Redis Sorted Set中,并且每个元素将具有其分数。我们将使用时间戳作为分数。此外,需要指定每个限制限流器的窗口大小…

    算法与数据结构 2023年5月19日
    00
  • 人脸检测中AdaBoost算法详解

    人脸检测中AdaBoost算法详解 什么是AdaBoost算法? AdaBoost(Adaptive Boosting,自适应增强算法)是一种分类算法,它可以将若干个弱分类器组合起来形成一个强分类器,以提高分类的准确率和鲁棒性。AdaBoost最初用于人脸识别领域,在实际应用中具有良好的效果。 AdaBoost分类器是如何工作的? AdaBoost分类器是基…

    算法与数据结构 2023年5月19日
    00
  • 合并排序(C语言实现)

    合并排序(C语言实现) 合并排序是一种将待排序序列分成多个子序列,分别进行排序,然后再将排序后的子序列合并成整体有序序列的排序算法。使用递归实现时,该算法的时间复杂度为O(nlogn),因此被广泛应用。 实现步骤 合并排序可以用以下步骤来实现: 分治:将待排序序列从中间分成两部分,递归地对左右两部分进行排序。 合并:将两个有序子序列合并成一个有序序列。 在实…

    算法与数据结构 2023年5月19日
    00
  • 简单掌握桶排序算法及C++版的代码实现

    简单掌握桶排序算法及C++版的代码实现 什么是桶排序? 桶排序(Bucket Sort)是一种常见的排序算法,它将数组中的元素分组至有限数量的桶中。每一个桶都可以视为一小部分数据的集合。根据桶内的元素所构成的数据的大小关系,可以在每个桶内部再分别使用其他排序算法或者递归地进行桶排序。最后,所有的桶按照顺序依次输出,即可得到有序序列。 桶排序算法的时间复杂度 …

    算法与数据结构 2023年5月19日
    00
  • stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    STL常用算法介绍 STL(Standard Template Library)是C++标准库的一个庞大组成部分,提供了大量的常用算法,容器以及迭代器等等。这些工具都可以被拿来用来解决大部分的计算问题。其中stl常用算法主要包括排序算法和非变序型队列,下面进行详细讲解。 stl排序算法 STL提供了丰富的排序算法模板,可以直接拿来使用,无需重新实现。以下是一…

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