字符串排序:C语言解法

  • *首先我们先要获得只有字母的排序列表(不能破坏相同字母本身的顺序),其中的技巧就是循环字符串遇到子母后,添加一个元素(letter - 'a')len + i,然后对整个列表排序,这样我们既能知道字母的顺序,有可以知道他原来在什么位置,是什么字母
  • 然后我们就可以判断原字符串每个位置是否是字母,如果不是,就把原字符串该位置的字符赋给结果对应的位置,如果是,就弹出列表的值(取余获得原来位置,取出字母)赋给结果的这个位置,以此循环
#include<stdio.h>
int cmp(int *a, int *b){
    return *a-*b;
}
int main(){
    char *str = (char*)malloc(sizeof(char)*1000);
    while(gets(str)){
        int len = strlen(str),temp = 0;
        int *order = (int*)malloc(sizeof(int)*len);
        char *result = (char*)malloc(sizeof(char)*len+1);
        memset(order, 0, sizeof(int)*len);
        memset(result, 0, sizeof(char)*len+1);
        for(int i=0; i<len; i++){
            char let1 = str[i];
            if(let1>='a' && let1<='z'){
                order[temp++] = (let1 - 'a')*len + i;
            }else if(let1>='A' && let1<='Z'){
                order[temp++] = (let1 - 'A')*len + i;
            }
        }
        qsort(order, temp, sizeof(int), cmp);
        temp = 0;
        for(int j=0; j<len; j++){
            char let2 = str[j];
            if((let2>='a' && let2<='z')||(let2>='A' && let2<='Z')){
                int n = order[temp++]%len;
                result[j] = str[n];
            }else{
                result[j] = let2;
            }
        }
        printf("%s\n",result);
    }
}