用分治计数对字符串进行排序~
正常来说字符串排序都是通过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编辑过]




