C /C++ 将两个有序数组合并成一个有序数组

#define Max 10
typedef  int Elemtype;

typedef struct {
    Elemtype data[Max];
    int length;
}Sqlist;

//交换两个元素的位置
void swap(Elemtype &a,Elemtype &b){
    Elemtype c;
    c = a;
    a = b;
    b = c;
}
//生成随机数组
void Random(int *a,int n,int l,int r)//生成范围在l~r的随机数
{
    srand(time(0));  //设置时间种子
    for(int i=0;i<n;i++){
        a[i]=rand()%(r-l+1)+l;//生成区间r~l的随机数
    }
}
//检索数组中最小元素的下标
int findMinIndex(Sqlist A,int start,int end){
    int Minindex = start;
    for(int j=start+1;j<end;++j){
        if(A.data[j]<A.data[Minindex]){
            Minindex = j;
        }
    }
    return Minindex;
}
//简单选择排序
void selectSort(Sqlist &A){
    for(int i=0;i<A.length-1;++i){
        int minIndex = findMinIndex(A,i,A.length);
        if(i!=minIndex){
            swap(A.data[i],A.data[minIndex]);
        }
    }
}
bool Merge(Sqlist &A,Sqlist &B,Sqlist &C){
    //如果两个表的长度比定义的 Max 都大,则直接返回 false:
    if(A.length+B.length>Max){
        return false;
    }
    //三个下标索引:
    int i = 0,
        j = 0,
        k = 0;
    
    while (i<A.length && j<B.length){
        if(A.data[i]<B.data[j]){
            C.data[k] = A.data[i];
            k++;
            i++;
        } else{
            C.data[k] = B.data[j];
            k++;
            j++;
        }
    }

    while (i<A.length){
        C.data[k++] = A.data[i++];
    }
    while (j<B.length){
        C.data[k++] = B.data[j++];
    }
    C.length = k ;
    cout<<endl;
    cout<<"合并之后的数组为:";
    for (int l = 0; l < C.length; ++l) {
        cout<<C.data[l]<<" ";

    }
}

int main(){
    Sqlist A;
    Sqlist B;
    Sqlist C;
    A.length = 4;
    B.length = 6;
    C.length = Max;
    Random(A.data,4,0,10);
    Random(B.data,6,0,50);
    selectSort(A);
    selectSort(B);
    cout<<"数组 A:";
    for (int i = 0; i < A.length; ++i) {
        cout<<A.data[i]<<" ";
    }
    cout<<"数组 B:";
    for (int i = 0; i < B.length; ++i) {
        cout<<B.data[i]<<" ";
    }
    Merge(A,B,C);
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值