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日

相关文章

  • Python算法绘制特洛伊小行星群实现示例

    下面是“Python算法绘制特洛伊小行星群实现示例”的完整攻略,包含两个示例说明。 1. 安装所需库 在开始绘制特洛伊小行星群之前,首先需要安装所需的Python库,包括numpy、matplotlib和mpl_toolkits.mplot3d等。可以使用以下命令进行安装: pip install numpy pip install matplotlib p…

    算法与数据结构 2023年5月19日
    00
  • php自定义二维数组排序函数array_orderby用法示例

    首先,让我们了解一下什么是“数组排序函数”以及“自定义排序函数”。 数组排序函数是指一些用来对数组排序的函数,例如sort()和asort()。自定义排序函数则是指我们可以根据自己的需求来编写一个排序函数,然后通过函数名传递给排序函数,让它按照我们自己的规则进行排序。 在PHP中,有一个函数array_orderby()可以帮助我们实现自定义排序功能。以下是…

    算法与数据结构 2023年5月19日
    00
  • 基于Go语言实现冒泡排序算法

    基于Go语言实现冒泡排序算法 什么是冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行,因而得名“冒泡排序”。该算法因其简单的实现方式和易于理解的原理而广泛应用。 冒泡排序算法实现方式 冒泡排序的算法原理如下: 比较相邻的元素。如果第一个…

    算法与数据结构 2023年5月19日
    00
  • PHP排序算法之快速排序(Quick Sort)及其优化算法详解

    PHP排序算法之快速排序(Quick Sort)及其优化算法详解 快速排序是一种高效的排序算法,也是PHP中常用的排序方法之一。在本攻略中,我们将介绍快速排序的基本思想与原理,以及一些优化算法和实际示例。 快速排序基本原理 快速排序的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后再按此方法对这两部…

    算法与数据结构 2023年5月19日
    00
  • Go语言展现快速排序算法全过程的思路及代码示例

    这里是关于“Go语言展现快速排序算法全过程的思路及代码示例”的详细攻略。 什么是快速排序算法 快速排序算法是一种基于比较的排序算法,它通过选择一个基准元素,将数组分为两部分然后递归地对这两部分进行排序,最终完成对整个数组的排序。快速排序算法的时间复杂度为 O(nlogn) 平均情况下,但是在最坏情况下会退化为 O(n^2)。 快速排序算法的实现思路 下面是快…

    算法与数据结构 2023年5月19日
    00
  • C语言排序算法之冒泡排序实现方法【改进版】

    C语言排序算法之冒泡排序实现方法【改进版】可以采用双层循环的方式实现。接下来,我将为您详细介绍该排序算法的实现方法。 冒泡排序的基本思路 冒泡排序的基本思路是:通过比较相邻的元素,将小的元素交换到前面,大的元素交换到后面。在第一轮排序时,第一个元素与第二个元素进行比较,若第一个元素比第二个元素大,则将两个元素交换位置。接下来,第二个元素与第三个元素进行比较,…

    算法与数据结构 2023年5月19日
    00
  • 详解高性能缓存Caffeine原理及实战

    详解高性能缓存Caffeine原理及实战 简介 Caffeine是一个基于Java的高性能缓存库,其目标是提供比ConcurrentHashMap更高效、更灵活的缓存方案。Caffeine支持多种缓存策略、过期机制以及可自定义的缓存加载策略等功能。本文将详细介绍Caffeine的原理、使用方法及实现实例。 Caffeine的原理 Caffeine的核心是一个…

    算法与数据结构 2023年5月19日
    00
  • js实现常用排序算法

    JS实现常用排序算法 排序算法是计算机领域中的重要算法之一,其作用是将一组无序的数据按照一定的规则进行排列,便于数据的查找和统计。在前端开发领域中,JS是常用的编程语言,下面一起来详细讲解如何用JS实现常用排序算法。 冒泡排序 冒泡排序是一种简单的排序算法,其具体思路是对需要排序的元素从头开始进行比较,如果前一个元素比后一个元素大,就交换这两个元素的位置,一…

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