标签:
一组随机排序的字母数字。请编写一个时间复杂度为O(n)的算法,使这些字母从小到大顺序排序。
说明:字母区分大小写,相同的字母,排序护小写排在前面。
例如:R,B,B,b,W,W,B,R,B,w
排序为:b,B,B,B,B,R,R,w,W,W
#include <stdio.h>
#include <string.h>
void getHelper();
int main() {
char str[100];
int helper[150]={0};
int i,j;
gets(str);
getHelper(str, helper);//复杂度为O(n)
for(i = ‘a‘; i <=‘z‘ ; i++) {//复杂度接近为O(1)
if(helper[i] > 0) {
for(j= 0;j < helper[i] ; j++){
printf("%c",i);
}
helper[i] = 0;
if(helper[i-32] >0) {
for(j= 0;j < helper[i-32] ; j++){
printf("%c",i-32);
}
}
helper[i-32] = 0;
}else if(helper[i-32] > 0){
for(j= 0;j < helper[i-32] ; j++){
printf("%c",i-32);
}
}
}
return 0;
}
void getHelper(char *p,int helper[]){
int i, len;
len = strlen(p);
for (i = 0; i < len; i++) {
helper[p[i]]++; /*将当前字符所对应的ASCII码作为helper数组的下标,同时加1*/
}
}
今天太晚了,先贴出来代码,明天我再做解释,大致看了一下,这个算法的应该为O(n),明天再说吧。明天再看看
标签:
原文地址:http://my.oschina.net/ccqy66/blog/484949