计数排序算法

参考: [url=http://hi.baidu.com/%D1%A9%D6%D0%CB%F2%D2%C2/blog/item/c699eff3b1d035c30a46e0df.html]计数排序算法[/url]

特性:

只用于无符号整数,对于有符号的整数可以通过对每个数组元素都加减一个数解决。
通过计算数组元素的最大、最小值得到统计数组的大小
需要使用额外的空间,空间大小是(元素的最大值-元素的最小值)
当待排序数组内有大量重复的数值时使用计数排序算法较有优势
时间复杂度是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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值