给出一个有序的整数数组A和有序的整数数组B,请将数组B合并到数组A中,变成一个有序的升序数组。数组A或者B可同时包含“整数”,“字符”,例如A=[1,4,7,A,B,c]

#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即可得到对应整数值),若为字符,则打印相应的字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值