用分治计数对字符串进行排序~
正常来说字符串排序都是通过strcmp来比较的,那能不能不以字符串为单位而是以单个字符为单位进行排序呢~对于某字符串可以这样,先对所有字符串的第一个字符进行排序,相等的就分成一组,那一组里面再对第二个字符进行排序……直到所有字符串都能独立分成一组(包括全等)为止~
那用分治法就是把那一行字符都相等的分成一组,剩下的部分分成另外一组,这样不断细分直到每一个字符串都是独立的一组(包括相等)为止~
就有如下代码~
不能保证说完全没有bug,但基本就是这个样子了可以看看~
程序代码:
#include<stdio.h> typedef struct Load { const char* p; size_t index; }Load; void nodeMal( void** ,size_t ); void nodeFree( void** ); int comp( const void*,const void* ); char* input( char* ,size_t ); void fun( const char* [],size_t,int (*)( const void*,const void* ) ); void _sort( Load* ,size_t,size_t,int (*)( const void*,const void* ) ); int main( void ) { #define __ARR_LEN( s ) \ (sizeof (s)/sizeof (*s)) char str[5][100]; const char* p[__ARR_LEN(str)]; size_t i; puts("Input 5 strings:"); for (i=0;i!=__ARR_LEN(str);++i) { input(str[i],sizeof (str)); p[i]=str[i]; } fun(p,__ARR_LEN(str),comp); puts("--------------------"); for (i=0;i!=__ARR_LEN(str);++i) puts(p[i]); return 0; #undef __ARR_LEN } #include<stdlib.h> #include<string.h> #include<assert.h> void nodeMal( void** p,size_t size ) { assert(p); *p=malloc(size); assert(*p); memset(*p,0,size); } void nodeFree( void** p ) { assert(p); free(*p); *p=NULL; } int comp( const void* p,const void* q ) { const char* const _p=(( Load* )p)->p; const char* const _q=(( Load* )q)->p; const size_t index=(( Load* )p)->index; return _p[index]-_q[index]; } char* input( char* s,size_t size ) { char* p=NULL; fgets(s,size,stdin); if ((p=strchr(s,'\n'))!=NULL) *p='\0'; else scanf("%*[^\n]%*c"); return s; } void fun( const char* str[],size_t n,int (*comp)( const void*,const void* ) ) { Load* load=NULL; size_t i; nodeMal(( void** )&load,n*sizeof (*load)); for (i=0;i!=n;++i) { load[i].p=str[i]; load[i].index=0; } qsort(load,n,sizeof (*load),comp); _sort(load,0,n,comp); for (i=0;i!=n;++i) str[i]=load[i].p; nodeFree(( void** )&load); } void _sort( Load* load,size_t low,size_t height,int (*comp)( const void*,const void* ) ) { if (low>=height) return ; { const Load key=load[low]; int flag=0; size_t i=low; for (;(i!=height)&&(comp(&key,&load[i])==0);++i) if (load[i].p[load[i].index]) ++load[i].index; else flag=1; if (i-low>1) qsort(&load[low],i-low,sizeof (*load),comp); if (height-low<2) return ; if (flag==0) _sort(load,low,i,comp); _sort(load,i,height,comp); } }
[此贴子已经被作者于2018-5-2 22:12编辑过]