合并有序的顺序表

合并顺序表

问题描述: 将两个升(降)序的顺序表合成一个升(降)序的顺序表。(写下来以升序为例)

分析:

1.设有两个升序的顺序表s1,s2;合成一个顺序表s。

2.则顺序表s的第一个元素是最小的,也就是顺序表s1和s2两个顺序表中的最小值,这个最小值一定在s1或s2的第一个元素。

3.找到最小值,接下来s的第二个值是谁呢?是s1和s2构成的集合中,除了s中的第一个值的最小值。

4.用一个指针i指向s1的第一个元素,j指向s2的第一个元素,比较第s1中i指向的值和s2中j指向的值,将较小的值存入s,对应的指针加1。(如果对于形式化的描述看的不是很清晰,请看代码)

//顺序表类型定义
typedef struct{

    int data[1001];
    int length;
}SeqList; 

//这个函数是用来创建顺序表的
SeqList * InitSeqList(int n){

    SeqList *s = (SeqList *)malloc(sizeof(SeqList));
    s->length = n;
    for(int i=0;i<n;++i)
        scanf("%d",s->data+i);

    return s;
}

//按照上述分析的代码如下
SeqList * Merge1(SeqList *s1, SeqList *s2){
    //首先创建一个空的顺序表s
    SeqList *s = InitSeqList(0);

    int i = 0;//i用来遍历s1
    //因为每次要挑出最小的值,i指向s1没存的那一部分的第一个值
    int j = 0;//j用来遍历s2
    //j和i的用处一样
    int k = 0;//k用来在s中存储
    //每次往s->data[k]中存值

    while(i<s1->length && j<s2->length){

        if(s1->data[i] < s2->data[j])
            s->data[k++] = s1->data[i++];
        else
            s->data[k++] = s2->data[j++];
    }
    //因为是比较一次存一个值,最后有一个顺序表一定有剩余,补在后边即可
    while(i<s1->length){

        s->data[k++] = s1->data[i++];
    }
    while(j<s2->length){

        s->data[k++] = s2->data[j++];
    }
    s->length = k;
    return s;

}

对上述代码进行简化

上面的代码只是有两中操作: 
1.向s中存s1->data[i] 
2.向s中存s2->data[j]

那么,如果找到一个关系,可以用一个选择结构分别处理这两种情况,就可以减少代码量。

即:

if(条件A){
    s->data[k++] = s1->data[i++];
}
else
    s->data[k++] = s2->data[j++];

接下来只要找到条件A即可: 什么时候存s1呢? 
1.s2如果存完了,则存储s1即可 
2.在s1和s2都没存完的情况下,并且s1->data[i]<s2->data[j] 3.整合条件即可

SeqList * Merge2(SeqList *s1, SeqList *s2){

    SeqList *s = InitSeqList(0);

    int i = 0;//i用来遍历s1
    int j = 0;//j用来遍历s2
    int k = 0;//k用来在s中存储

    //注意这里的逻辑连接词是||;第一种方法的是&&
    while(i<s1->length || j<s2->length){
        //再循环条件中,有个前提就是s1和s2至少有一个没有存完
        if(j == s2->length || i<s1->length && s1->data[i]<s2->data[j])
        //||是个短路运算符,如果j==s2->length不成立,说明s2没有存完,则需要与s1比较
        //如果j==s2->length成立,则说明s2存完了,存储s1即可
            s->data[k++] = s1->data[i++];
        else
            s->data[k++] = s2->data[j++];
    } 
    s->length = k;

    return s;
}

最后提一句,如果是一个升序的一个降序的,怎么和成一个升序,或者一个降序的顺序表?

可以将其中一个先进行逆置操作哦(⊙o⊙)

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有序合并是指将两个有序合并成一个有序表的操作。在C语言中,可以使用数组来表示有序表,并通过遍历和比较元素的方式进行合并。 以下是一个简单的示例代码,演示了如何合并两个有序表: ```c #include <stdio.h> // 合并有序表的函数 void merge(int arr1[], int size1, int arr2[], int size2, int result[]) { int i = 0, j = 0, k = 0; // 遍历两个有序表,比较元素大小,并将较小的元素放入结果数组中 while (i < size1 && j < size2) { if (arr1[i] <= arr2[j]) { result[k++] = arr1[i++]; } else { result[k++] = arr2[j++]; } } // 将剩余的元素放入结果数组中 while (i < size1) { result[k++] = arr1[i++]; } while (j < size2) { result[k++] = arr2[j++]; } } int main() { int arr1[] = {1, 3, 5, 7}; int size1 = sizeof(arr1) / sizeof(arr1[0]); int arr2[] = {2, 4, 6, 8}; int size2 = sizeof(arr2) / sizeof(arr2[0]); int result[size1 + size2]; // 结果数组大小为两个有序表的大小之和 merge(arr1, size1, arr2, size2, result); printf("合并后的有序表:"); for (int i = 0; i < size1 + size2; i++) { printf("%d ", result[i]); } printf("\n"); return 0; } ``` 运行以上代码,输出结果为: ``` 合并后的有序表:1 2 3 4 5 6 7 8 ``` 这段代码中,`merge`函数接受两个有序表的数组和大小,以及一个结果数组。它使用三个指针分别指向两个有序表和结果数组的当前位置,通过比较元素大小,将较小的元素放入结果数组中。最后,将剩余的元素依次放入结果数组中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值