各位老师,现在开发遇到了一个排序问题:
有一串字母与数字相结合的编号,需要给它们进行排序。
排序的规则为先按字母顺序排列,再按数字大小排列。
举个例子:
zk1 zk2 zk3 dk1 dt1 dk2
排序后为
dk1 dk2 dt1 zk1 zk2 zk3
提前感谢!
void sep(char * s, char * ch, int * num)
{
*num = 0;
for (int i = 0; s[i]; i++)
{
if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z'))
{
*ch = s[i];
ch++;
}
else if (s[i] >= '0' && s[i] <= '9')
{
*num = *num * 10;
*num = *num + s[i] - '0';
}
}
* ch = '\0';
}
void cmp(void * a, void * b)
{
char *aa = *((char **)a);
char *bb = *((char **)b);
int ai;
int bi;
char as[100];
char bs[100];
sep(aa, as, &ai);
sep(bb, bs, &bi);
if (strcmp(as, bs) == 0)
return ai - bi;
else
return strcmp(as, bs);
}
主程序
char * arr[] = {"zk1","zk2","zk3","dk1","dj2", "dk3"};
qsort(arr, 6, sizeof(char *), cmp);
直接用字符串的排序就行了
字符串会通过ascii码排序,字母小写、字母大写、数字,同类型的ascii大小的先后顺序和原本一样
java中String有compareTo方法可以用,c++我不清楚
如果你没找到字符串排序,那就按位转成char比较大小,char和int可以互转的,char转成int就是ascii码
https://stackoverflow.com/questions/642213/how-to-implement-a-natural-sort-algorithm-in-c
while循环,逐个字符进行比较,如果是字母,直接比较,如果不等,则直接得出结果,break,如果相等,则比较下一个,如果待比较的字符是数字,则将其分别另存到两个临时数组中,continue,两个字符串均直到找到最后一个数字,将另存的数组转换为int类型进行比较。如果比较不相等,则继续获取下一个字符进行判断是字母还是数字。
while循环退出的条件是两个待比较的字符串任何一个为'\0',或者提前比较出结果break。如果while结束后,依然未比较出结果,则已经达到‘\0’的字符串小,如果两个字符串均达到了‘\0’,则认为相等。
这样,不管字母和数字的位置如何混合,都可以比较出结果。