[英]sorting the order of string with a corresponding array of integer in c programming
所以我将数字和字母放入一个数组和一个字符串中,但是它们是相关的,因为10b必须为10b,4b必须为4b。
我希望按照字母顺序从a到b到c ...对字符串进行排序...等等
具有ASCII奇数字母的数字应按升序排列,而具有ASCII偶数字母的数字应按降序排列。
即以下情况应为5a 12a 10b 4b 4h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char *argv[]) {
char *alpha[] = {"b", "b", "h", "a", "a"};
int num[5]= {4,10,4,12, 5};
int i;
printf("The classes are ");
for (i=0; i<5; i++){
printf("%d%s ", num[i], alpha[i]);
}
printf("\n");
printf("The classes are rearragnged to:");
return 0;
}
关于如何对它们进行排序的任何想法?
(特别注意:我尝试了冒泡排序,但实际上并不能用于数组和字符串...我也将它们都放在字符串中,但是当使用4b和10b进行排序时,由于它无法比较正确的字符串,因此它是随机的一位数与两位数的位置...)
如果将alpha
和num
视为对,则表示此的最佳方法通常是将它们组合到一个对象中(然后对这些对象进行排序),而不是管理两个单独的数组(它们不表示此“对”关系)。 如果由于某种原因而不允许您更改数据结构,那么还有其他方法(如果需要,您可以稍后询问)。 但让我在这里提出表达“成对”意图的解决方案:
struct classStruct {
char *alpha;
int num;
};
int compareClassStructByLetter(const void *c1, const void *c2) {
struct classStruct* c1Ptr = (struct classStruct *)c1;
struct classStruct* c2Ptr = (struct classStruct *)c2;
int result = 0;
int strcmpResult = strcmp(c1Ptr->alpha, c2Ptr->alpha);
if (strcmpResult != 0) {
result = strcmpResult;
}
else {
result = c2Ptr->num - c1Ptr->num; // ascending order...
char c = *c1Ptr->alpha;
if (c % 2) { // odd alpha? (for example, 'a'== 65 == odd)?
result = -result; // reverse order to descending
}
}
return result;
}
int main(int argc, char *argv[]) {
int i;
struct classStruct classes[5] = {
{ "b", 4 },
{ "b", 10 },
{ "h", 4 },
{ "a", 12 },
{ "a", 5 }
};
printf("The classes are ");
for (i=0; i<5; i++){
printf("%d%s ", classes[i].num, classes[i].alpha);
}
printf("\n");
qsort(classes, 5, sizeof(struct classStruct), compareClassStructByLetter);
printf("The classes are rearragnged to:");
for (i=0; i<5; i++){
printf("%d%s ", classes[i].num, classes[i].alpha);
}
printf("\n");
return 0;
}
该程序的输出如下:
The classes are 4b 10b 4h 12a 5a
The classes are rearragnged to:5a 12a 10b 4b 4h
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.