排序算法之计数排序

今在学习中,遇到计数排序算法,虽然其对待排序的序列要求严格,但对于符合条件的序列来说,其时间复杂度很小。故列于此,仅为学习记忆。

 

参考资料:http://blog.csdn.net/v_JULY_v/archive/2011/04/23/6347454.aspx

 

对于仅由大写字母(或小写字母)构成的无序序列,可采用下面算法进行排序。该算法不在序列的每个元素间进行比较,而是使用了一个额外的help整型字符串来记录每个元素出现的频度,然后通过一个巧妙的递加,计算出每个元素在排序好序列中的位置。

 

void CounterSort(const char *str, char *help_str)

{

//辅助计数数组

int help[26] = {0};

int i, j, k, index, pos;

 

//help[index]存放了元素'A' + index的个数

for(i = 0; i < strlen(str); i++)

{

index = str[i] - 'A';

help[index]++;

}

 

//求出每个元素对应的位置

for(j = 1; j < 26; j++)

help[j] += help[j - 1];

 

//把每个元素放到对应的位置

for(k = strlen(str) - 1; k > 0; k--)

{

index = str[k] - 'A';

pos = help[index] - 1;

help_str[pos] = str[k];

help[index]--;

}

}

 

从上面的代码可以看书,该排序过程的时间复杂度为O(m),其中m为字符串str的长度(help_str与str同长)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值