标签:
一组随机排序的字母数字。请编写一个时间复杂度为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