今在学习中,遇到计数排序算法,虽然其对待排序的序列要求严格,但对于符合条件的序列来说,其时间复杂度很小。故列于此,仅为学习记忆。
参考资料: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同长)。