c语言合并两个已排序数组的示例(c语言数组排序)

 更新时间:2014年03月13日 15:46:38   作者:  
如何将两个已排序数组合并成一个排序数组,下面我们给出使用c语言合并两个已排序数组的示例,需要的朋友可以参考下

问题:将两个已排序数组合并成一个排序数组

这里先不考虑大数据量的情况(在数据量很大时不知大家有什么好的思路或方法?),只做简单数组的处理。

简单代码如下:

说明:之所以把merge函数定义成返回数组长度,是因为后续会有重复数据合并功能的merge版本,考虑到接口一致性。

复制代码 代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int merge(int* ar1, int len1, int* ar2, int len2, int** rtn)
/*++
 DeScription:
    This routine merge two sorted arrays into one sorted array,
    the same values in different arrays will be keeped.

Arguments:
    ar1 - The first sorted array to be merged
    len1 - The num of items in ar1
    ar2 - The second sorted array to be merged
    len2 - The num of items in ar2
    rtn - The caller proviced pointer to get the result array,
        memory allocated for rtn should be free by the caller.

Return Value:
    The num of items in the merge array
--*/
{
    int i=0,j=0,k=0;
    int m=0;
    int* res = NULL;

    if (ar1 == NULL || ar2 == NULL || rtn == NULL) {
        return 0;
    }

    *rtn = (int *)malloc((len1+len2)*sizeof(int));
    if(*rtn == NULL) {
        return 0;
    }
    memset(*rtn, 0, (len1+len2)*sizeof(int));
    res = (int*)*rtn;

    while(i<len1 && j<len2) {
        if (ar1[i]<=ar2[j]) {
            res[k++] = ar1[i++];
        } else {
            res[k++] = ar2[j++];
        }
    }

    while(i<len1) {
        res[k++] = ar1[i++];
    }
    while(j<len2) {
        res[k++] = ar2[j++];
    }

    return  len1+len2;
}

int merge_test()
{
    int a1[] = {0,1,2,5,8,19,34,43,52};
    int a2[] = {1,4,5,12,17,33,42,51,53,65,76};
    int len1 = sizeof(a1)/sizeof(int);
    int len2 = sizeof(a2)/sizeof(int);
    int i = 0, len = 0;
    int* a3 = NULL;
    int* ptr = NULL;

    len = merge(a1, len1, a2, len2, &a3);
    if (a3 == NULL) {
        printf("a3==NULL\n");
        return 1;
    }

    ptr = a3;
    while(i<len) {
        printf("a3[%3d]---->%8d\n", i++, *ptr++);   
    }

    if (a3 != NULL) {
        free(a3);
    }

    return 0;
}

int main(int argc, char* argv[])
{
    merge_test();

    return 0;
}

相关文章

  • while和for可以相互转换的例子分享

    while和for可以相互转换的例子分享

    这篇文章主要介绍了while和for可以相互转换的例子,需要的朋友可以参考下
    2014-02-02
  • C++中Semaphore内核对象用法实例

    C++中Semaphore内核对象用法实例

    这篇文章主要介绍了C++中Semaphore内核对象用法实例,有助于深入了解信号量(Semaphore)的基本用法,需要的朋友可以参考下
    2014-10-10
  • 利用C语言实现简易版扫雷

    利用C语言实现简易版扫雷

    这篇文章主要为大家详细介绍了C语言实现简易版扫雷,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • 使用C语言如何输出逆序数

    使用C语言如何输出逆序数

    逆序数的就是把一个数倒过来,例如:1234那么它的逆序数就为4321,我们该如何是实现呢?下面这篇文章主要给大家介绍了关于使用C语言如何输出逆序数的相关资料,需要的朋友可以参考下
    2022-01-01
  • C语言实现出栈序列

    C语言实现出栈序列

    这篇文章主要为大家详细介绍了C语言实现出栈序列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • 使用C++实现Range序列生成器的示例代码

    使用C++实现Range序列生成器的示例代码

    在C++编程中,经常需要迭代一系列数字或其他可迭代对象,本文将使用C++来实现一个简单的Range封装,文中的示例代码讲解详细,感兴趣的可以了解下
    2023-11-11
  • 基于C语言实现http下载器

    基于C语言实现http下载器

    做OTA升级功能时,我们能直接拿到的往往只是升级包的链接,需要我们自己去下载,这时候就需要用到http下载器。本文将利用C语言实现简单的http下载器,感兴趣的可以了解一下
    2022-12-12
  • C++ map与set封装实现过程讲解

    C++ map与set封装实现过程讲解

    set set是一种关联式容器,下面这篇文章主要给大家介绍了关于C++中map和set使用的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友可以参考下
    2023-03-03
  • VC判断进程是否具有administrator权限的方法

    VC判断进程是否具有administrator权限的方法

    这篇文章主要介绍了VC判断进程是否具有administrator权限的方法,在Windows应用程序设计中具有一定的实用价值,需要的朋友可以参考下
    2014-10-10
  • c/c++ 利用sscanf进行数据拆分操作

    c/c++ 利用sscanf进行数据拆分操作

    这篇文章主要介绍了c/c++ 利用sscanf进行数据拆分操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12

最新评论