#include <stdio.h>
#include <stdlib.h>
// 定义一个结构体来保存每个元素的值及其类型
typedef struct Element {
int value; // 用于存储整数值或字符的ASCII值
char type; // 'i' 表示整数,'c' 表示字符
} Element;
// 比较函数 比较Element结构体中的value
int compare(const void *a, const void *b) {
Element *ea=(Element *)a;
Element *eb=(Element *)b;
return ea->value - eb->value;
}
// 将排好序的A、B数组合并为一个有序数组
void merge(Element A[], int n, Element B[], int m, Element r[]) {
int i=0,j=0,k=0;
while(i<n&&j<m){
if(A[i].value<=B[j].value){
r[k++] = A[i++];
} else {
r[k++] = B[j++];
}
}
// 如果A还有剩余元素
while(i<n){
r[k++]=A[i++];
}
// 如果B还有剩余元素
while(j<m){
r[k++]=B[j++];
}
}
int main() {
Element A[]={{49,'i'},{52,'i'},{55,'i'},{65,'c'},{66,'c'},{99,'c'}}; // '1', '4', '7', 'A', 'B', 'c'
Element B[]={{50,'i'},{51,'i'},{53,'i'},{67,'c'},{98,'c'}}; // '2', '3', '5', 'C', 'b'
int n=sizeof(A)/sizeof(A[0]);
int m=sizeof(B)/sizeof(B[0]);
Element r[n+m];
merge(A,n,B,m,r);
qsort(r,n+m,sizeof(Element),compare);
for(int i=0;i<n+m;i++) {
if(r[i].type=='i'){
printf("%d ", r[i].value-48 );
}else{
printf("%c ", r[i].value);
}
}
return 0;
}
1.定义结构体,用于记录每个元素的ASCII码值和类型,便于后续进行比较和输出打印
2.比较函数compare,使用在C标准库函数qsort中,以便对数组进行排序。
该函数接受的参数类型为const void *,const void *是一个指向常量空类型的指针,它可以接收任何类型的指针。
该函数中需将const void *类型的指针转换成Element *类型的指针,以便我们对结构体中的成员变量进行访问。
该函数返回的值为int类型。通过比较ea->value和eb->value的值,得到元素两两之间的先后顺序。若返回值为负,qsort则会判定a在b之前;若返回值为正,b在a之前;若返回值为零,则a和b的相对位置可以保持不变。
3.合并函数merge,将有序的A、B数组合并为一个有序的数组。通过遍历A和B数组,将A和B当前元素的较小者保存到r数组中。若一个数组遍历完毕,则将另一个数组的剩余元素“复制”到r数组中。
4.qsort函数是c语言标准库的一个函数,用于对数组进行排序。接收的参数包括指向待排序数组的指针、数组中元素的个数、数组中每个元素的字节数以及一个指向比较函数的指针。
5.主函数main,调用merge函数将A和B合并到r中,并调用qsort函数对r数组进行排序。最后循环遍历数组r并输出打印,若为整数,则打印整数值(将ASCII码减48即可得到对应整数值),若为字符,则打印相应的字符。