`
wengshanjin
  • 浏览: 23581 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

计数排序算法

阅读更多
参考: 计数排序算法

特性:

只用于无符号整数,对于有符号的整数可以通过对每个数组元素都加减一个数解决。
通过计算数组元素的最大、最小值得到统计数组的大小
需要使用额外的空间,空间大小是(元素的最大值-元素的最小值)
当待排序数组内有大量重复的数值时使用计数排序算法较有优势
时间复杂度是max( O(元素的最大值-元素的最小值), O(n) )
空间复杂度是max( O(元素的最大值-元素的最小值), O(n) )
#include <iostream>
#include <vector>
#include <time.h>

typedef std::vector<size_t> TIntArray;
static void display(const TIntArray& vecValue)
{
 for( size_t i = 0; i < vecValue.size(); ++i )
 {
  if( i != 0 && (i % 10) == 0 )
   std::cout << std::endl;
  std::cout << vecValue[i] << " ";
 }
 std::cout << std::endl;
}

class TCountSort
{
public:
 static void setMaxBound(size_t nMaxBound) { g_nMaxBound = nMaxBound; }

 bool countSort(TIntArray& vecValue)
 {
  size_t nSize = vecValue.size();
  if( nSize <= 0 )
   return false;

  size_t nMinValue = vecValue[0], nMaxValue = vecValue[0];
  getMinMaxValue(vecValue, nMinValue, nMaxValue);

  size_t nBound = nMaxValue - nMinValue + 1;
  if( nBound > g_nMaxBound )
   return false;

  resetEnv(nSize, nBound);
  size_t i = 0;
  //统计每个数出现的次数
  for( i = 0; i < nSize; ++i )
   ++m_vecStat[vecValue[i] - nMinValue];
  for( i = 1; i < nBound; ++i )
   m_vecStat[i] += m_vecStat[i-1];

  //根据统计数组将原数组排序到m_vecSwap
  for( i = nSize - 1; i >= 0 && i < nSize; --i )
  {
   m_vecSwap[m_vecStat[vecValue[i]-nMinValue] - 1] = vecValue[i];
   --m_vecStat[vecValue[i]-nMinValue];
  }
  vecValue.swap(m_vecSwap);
  return true;
 }

private:
 static size_t g_nMaxBound;
 TIntArray m_vecSwap;
 TIntArray m_vecStat;

 void resetEnv(size_t nSortArraySize, size_t nBound)
 {
  m_vecSwap.resize(nSortArraySize);
  m_vecStat.resize(nBound);
  for( size_t i = 0; i < nBound; ++i )
   m_vecStat[i] = 0;
 }
 
 void getMinMaxValue(const TIntArray& vecValue, size_t& nMinValue, size_t& nMaxValue)
 {
  nMinValue = vecValue[0];
  nMaxValue = vecValue[0];
  for( size_t i = 1; i < vecValue.size(); ++i )
  {
   if( nMinValue > vecValue[i] )
    nMinValue = vecValue[i];
   if( nMaxValue < vecValue[i] )
    nMaxValue = vecValue[i];
  }
 }
};

size_t TCountSort::g_nMaxBound = 1024 * 1024;

void initSrcArray(TIntArray& vecValue, size_t nCount)
{
 size_t t = static_cast<size_t>( time(NULL) );
 for(size_t i = 0; i < nCount; ++i )
  vecValue.push_back( ((t+ i + 3) * (t+ i + 11)) % 10 );
}

void testCountSort()
{
 TIntArray vecValue;
 initSrcArray(vecValue, 10);

 std::cout << "排序前为:" << std::endl;
 display(vecValue);

 TCountSort countSort;
 countSort.countSort(vecValue);
 std::cout << "排序后为:" << std::endl;
 display(vecValue);
}


分享到:
评论

相关推荐

    超级经典的计数排序算法,号称效率达到了O(n)

    超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称效率达到了O(n) 超级经典的计数排序算法,号称...

    java实现计数排序算法

    countingSort 方法实现了计数排序算法。首先,我们遍历一遍原数组,找出其中的最大值,以确定计数数组的大小。然后,创建计数数组 count,并将每个元素的出现次数记录在计数数组中。接下来,根据计数数组中的元素...

    计数排序算法的C语言实现

    计数排序算法的效率主要取决于输入数据的特性,因此在实际应用中,需要根据具体情况进行选择。 总结来说,计数排序是一种非常特殊的排序算法,它通过预处理得到每个元素出现的次数,再利用这些信息直接确定每个元素...

    php计数排序算法的实现代码(附四个实例代码)

    计数排序算法的实现步骤包括以下几个关键点: 1. 找出待排序数组中最大和最小的元素。这一步骤是为了确定待排序数组中数据的范围。 2. 统计数组中每个值为i的元素出现的次数,存入数组C的第i项。通过遍历待排序数组...

    JavaScript计数排序算法1

    JavaScript中的计数排序算法是一种非比较型排序算法,它的核心思想是通过统计待排序数组中每个元素出现的次数,然后根据这些计数直接确定每个元素在输出数组中的位置。由于这种算法是基于数字的出现频率来进行排序,...

    计数排序算法实例

    计数排序是一种非基于比较的排序算法,它适用于待排序数据是整数的情况。这种算法的基本思想是通过统计每个整数出现的次数,然后利用这些信息来直接确定每个元素在输出数组中的位置。计数排序在某些特定情况下可以...

    计数排序算法介绍以及使用Java语言实现

    ### 计数排序算法介绍及Java实现 #### 一、计数排序算法基本概念 计数排序(Counting Sort)是一种非比较型的线性时间复杂度排序算法,其核心思想在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种...

    Java实现计数排序算法(源代码)

    ### Java实现计数排序算法详解 #### 一、概述 计数排序是一种高效的非比较型整数排序算法,尤其适用于已知数据范围内非负整数的排序任务。它通过统计数组中每个数值出现的频率来确定各个数值在排序后数组中的确切...

    详解计数排序算法及C语言程序中的实现

    关于计数排序算法 当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。 由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待...

    基于python的计数排序算法设计与实现

    基于python的计数排序算法设计与实现

    一种改进的计数排序算法 (2010年)

    计数排序算法是一种非比较排序算法,适用于一定范围内的整数排序,其核心思想是利用数组下标来确定元素的正确位置。计数排序的平均时间复杂度和空间复杂度均为O(n),但当输入数据的范围很大时,空间复杂度可能会很高...

    计数排序的算法实现

    计数排序是一种非基于比较的排序算法,它适用于待排序的元素是整数的情况。这种算法的基本思想是通过统计每个不同整数出现的次数,然后根据这些计数值来确定每个元素在排序结果中的位置。计数排序的时间复杂度为O(n)...

    最快的排序算法 计算机最快的算法-史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机!...,排序算法数据结构

    计数排序算法是一种高效的排序算法,它的工作原理是通过将数组中的每个元素转换成一个计数,然后将计数排序,以达到排序的目的。计数排序算法的时间复杂度为O(n+k),因此它适合大规模的数据排序。 11.Timsort排序...

    计数排序算法.zip

    排序算法:排序算法是将一组数据按照一定的顺序排列的算法。常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。 搜索算法:搜索算法用于在数据集中查找特定元素的算法。常见的搜索算法包括...

    排序算法之计数排序源代码另附博客地址

    排序算法之计数排序,计数排序是一种线性的排序算法,比基于比较的排序算法效率高,但其应用有特定的领域。我给出了两种策略的计数排序算法,欢迎下载~~如程序中有Bug,恳请指正!

    最快的排序算法 最快的算法而且不用递归!运行时间是线性的!,排序算法数据结构

    计数排序算法 计数排序算法是一种高效的排序算法,它的运行时间是线性的,不需要递归,且对系统资源的占用也较小。这种算法的基本思想是对每一个输入元素x,确定小于x的元素个数,然后根据这个信息,将x放到它在...

    算法与分析实验3: 利用预排序、堆排序和计数排序解决排序问题

    **计数排序算法**: 计数排序是一种非基于比较的排序方法,通过统计每个元素出现的次数,确定它们在输出数组中的位置。对于有限且范围不大的整数集合尤其有效。算法`ComparisonCountingSort`会创建一个计数数组,...

    C语言版的排序方法---计数排序.docx

    1. 初始化计数数组:在计数排序算法中,我们需要一个额外的数组来存储每个元素的出现次数,这个数组被称为计数数组。在初始化时,我们将所有元素的出现次数设置为0。 2. 统计元素出现次数:遍历原始数组,并对每个...

    详解Java常用排序算法-计数排序

    需要注意的是,计数排序算法的时间复杂度为 O(n+k),其中 k 为待排序的元素的最大值。这意味着,当待排序的元素非常大时,算法的时间复杂度将变高。因此,计数排序算法适用于待排序的元素较小的场景。

    Python实现的计数排序算法示例

    以下是对计数排序算法原理和Python实现的详细解析。 ### 计数排序的基本思想 1. **预处理阶段**:遍历输入数组,统计每个元素出现的次数,将这些信息存储在一个辅助数组`c`中。例如,如果输入数组是`[2, 5, 3, 0, ...

Global site tag (gtag.js) - Google Analytics