#include<stdio.h> #include<string.h> typedef struct { char *mem; char len; }m_table_t; int table_cmp(m_table_t *p1, m_table_t *p2) { int ret; if(p1->len == p2->len) return memcmp(p1->mem, p2->mem, p1->len); if(p1->len > p2->len) ret = memcmp(p1->mem, p2->mem, p2->len); else ret = memcmp(p1->mem, p2->mem, p1->len); if(0 == ret) return p1->len - p2->len; return ret; } void sort(m_table_t *a, int num) { int i,j; m_table_t temp; for(i=0;i<num;i++) { for(j=0;j<num;j++) { if( table_cmp(&a[j], &a[j+1] ) > 0) { memcpy( &temp, &a[j], sizeof(m_table_t) ); memcpy( &a[j], &a[j+1], sizeof(m_table_t) ); memcpy( &a[j+1], &temp, sizeof(m_table_t) ); } } } } void quickSort(m_table_t *s, int l, int r) { int i, j; m_table_t x; if (l < r) { i = l; j = r; memcpy(&x, &s[i], sizeof(m_table_t) ); while (i < j) { while(i < j && (table_cmp(&s[j], &x) > 0)) j--; if(i < j) { memcpy( &s[i++], &s[j], sizeof(m_table_t) ); } while(i < j && (table_cmp(&x, &s[i]) > 0 )) i++; if(i < j) { memcpy(&s[j--], &s[i], sizeof(m_table_t) ); } } memcpy(&s[i], &x, sizeof(m_table_t) ); quickSort(s, l, i - 1); quickSort(s, i + 1, r); } } int str2table(m_table_t *table, char *str, int *index) { int i,w; *index = 0; for(i=0,w= -1; i<strlen(str); i++) { if(' ' != *(str+i) ) { if( (-1 == w) ) { w = i;//start } } else { if(-1 != w)//stop { table[*index].mem = str+w; table[*index].len = i - w; (*index)++; w = -1; } } } if(-1 != w) { table[*index].mem = str+w; table[*index].len = i - w; (*index)++; w = -1; } return 0; } void display(m_table_t *table, int index) { int i; char tmp[15] = {0}; for(i=0; i<index; i++) { memset(tmp, 0, 15); memcpy(tmp, table[i].mem, table[i].len); printf("%s ", tmp); } return; } int main(void ) { int index; char input[100] = {0}; m_table_t g_table[15]= {0}; gets(input); str2table(&g_table[0], input, &index); quickSort(&g_table[0], 0, index-1);//sort(&g_table[0], index-1); display(&g_table[0], index); return 0; }