计数排序(Counting Sort)
计数排序用到一个额外的计数数组C,根据数组C来将原数组A中的元素排到正确的位置。
通俗地理解,例如有10个年龄不同的人,假如统计出有8个人的年龄不比小明大(即小于等于小明的年龄,这里也包括了小明),那么小明的年龄就排在第8位,通过这种思想可以确定每个人的位置,也就排好了序。当然,年龄一样时需要特殊处理(保证稳定性):通过反向填充目标数组,填充完毕后将对应的数字统计递减,可以确保计数排序的稳定性。
计数排序的步骤如下:
统计数组A中每个值A[i]出现的次数,存入C[A[i]]
从前向后,使数组C中的每个值等于其与前一项相加,这样数组C[A[i]]就变成了代表数组A中小于等于A[i]的元素个数
反向填充目标数组B:将数组元素A[i]放在数组B的第C[A[i]]个位置(下标为C[A[i]] - 1),每放一个元素就将C[A[i]]递减
计数排序的实现代码如下:
#include<iostream>
using namespace std;
// 分类 ------------ 内部非比较排序
// 数据结构 --------- 数组
// 最差时间复杂度 ---- O(n + k)
// 最优时间复杂度 ---- O(n + k)
// 平均时间复杂度 ---- O(n + k)
// 所需辅助空间 ------ O(n + k)
// 稳定性 ----------- 稳定
const int k = 100; // 基数为100,排序[0,99]内的整数
int C[k]; // 计数数组
void CountingSort(int A[], int n)
{
for (int i = 0; i < k; i++) // 初始化,将数组C中的元素置0(此步骤可省略,整型数组元素默认值为0)
{
C[i] = 0;
}
for (int i = 0; i < n; i++) // 使C[i]保存着等于i的元素个数
{
C[A[i]]++;
}
for (int i = 1; i < k; i++) // 使C[i]保存着小于等于i的元素个数,排序后元素i就放在第C[i]个输出位置上
{
C[i] = C[i] + C[i - 1];
}
int *B = (int *)malloc((n) * sizeof(int));// 分配临时空间,长度为n,用来暂存中间数据
for (int i = n - 1; i >= 0; i--) // 从后向前扫描保证计数排序的稳定性(重复元素相对次序不变)
{
B[--C[A[i]]] = A[i]; // 把每个元素A[i]放到它在输出数组B中的正确位置上
// 当再遇到重复元素时会被放在当前元素的前一个位置上保证计数排序的稳定性
}
for (int i = 0; i < n; i++) // 把临时空间B中的数据拷贝回A
{
A[i] = B[i];
}
free(B); // 释放临时空间
}
int main()
{
int A[] = { 15, 22, 19, 46, 27, 73, 1, 19, 8 }; // 针对计数排序设计的输入,每一个元素都在[0,100]上且有重复元素
int n = sizeof(A) / sizeof(int);
CountingSort(A, n);
printf("计数排序结果:");
for (int i = 0; i < n; i++)
{
printf("%d ", A[i]);
}
printf("\n");
return 0;
}
分享到:
相关推荐
计数排序是一种非基于比较的排序算法,它适用于待排序数据是整数的情况。这种算法的基本思想是通过统计每个整数出现的次数,然后利用这些信息来直接确定每个元素在输出数组中的位置。计数排序在某些特定情况下可以...
### 计数排序源代码C++实现 #### 知识点概述 计数排序是一种非比较型整数排序算法,其通过确定每个元素在最终排序数组中的位置来达到排序的效果,而无需相互比较。该算法适用于一定范围内的整数排序,并且在数据...
计数排序作为排序算法中的一个重要分支,尽管它并不基于元素间的比较操作,却以其独特的方式解决了特定范围内的整数排序问题。计数排序的核心思想在于统计每个待排序数值在原数组中的出现频率,然后依据这些频率信息...
计数排序是一种非基于比较的排序算法,它的主要思想是通过统计待排序数组中每个元素出现的次数,然后根据这些计数来确定每个元素在排序结果中的位置。这种算法特别适用于整数排序,且在数据范围不大的情况下,效率极...
计数排序是一种非基于比较的排序算法,它适用于待排序的元素是整数的情况。这种算法的基本思想是通过统计每个不同整数出现的次数,然后根据这些计数值来确定每个元素在排序结果中的位置。计数排序的时间复杂度为O(n)...
超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称...
Java实现计数排序不是C,Java实现计数排序不是C,Java实现计数排序不是C
主要是对算法导论中计数排序的实现
计数排序(代码片段)
排序算法之计数排序,计数排序是一种线性的排序算法,比基于比较的排序算法效率高,但其应用有特定的领域。我给出了两种策略的计数排序算法,欢迎下载~~如程序中有Bug,恳请指正!
计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数排序.py 使用python来实现计数...
计数排序是一种非比较型的排序算法,适用于一定范围内的整数排序。在该算法中,使用一个额外的数组C,其中第i个元素是待排序数组A中值等于i的元素的个数。计数排序的关键在于它不是比较两个元素的大小,而是统计每个...
内容概要:本文介绍了计数排序的基本思想、时间复杂度O(n+k)、空间复杂度O(k)以及其稳定性。详细描述了计数排序是一种非比较类型的排序算法,通过统计每个值出现的次数来完成排序。提供了一个C++实现的示例代码。 ...
### Python3实现计数排序(源代码) #### 实现原理 计数排序是一种非基于比较的排序算法,其核心思想是将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据...
### C++实现计数排序(源代码) #### 实现原理 计数排序是一种非比较型整数排序算法,其核心思想在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序算法,计数排序要求输入的...
该资源提供了在Java中如何实现计数排序的全面指南。文档涵盖了计数排序的基本概念,包括如何对数组进行排序以及如何在Java中实现计数排序。此外,文档还包括一个逐步指南,介绍了如何在Java中实现计数排序,包括详细...
利用python实现计数排序,程序直接可以用
JavaScript中的计数排序算法是一种非比较型排序算法,它的核心思想是通过统计待排序数组中每个元素出现的次数,然后根据这些计数直接确定每个元素在输出数组中的位置。由于这种算法是基于数字的出现频率来进行排序,...
计数排序是一种非基于比较的排序算法,它适用于待排序的元素是整数的情况。它的基本思想是通过确定每个输入元素出现的次数,然后利用这些信息来直接计算出每个元素在输出序列中的位置。计数排序是线性的,时间复杂度...
计数排序介绍和Java代码实现 计数排序是一种非比较的线性时间复杂度排序算法,它通过统计每个元素在待排序数组中出现的次数,然后根据统计信息将元素放回原数组中,从而实现排序。下面是计数排序的详细介绍。 计数...