两个已排序数组的合并-C语言
最近在纸上写一个已排序数组的合并时,花了超过预期的时间。仔细想想,这种要放到毕业找工作那会两下就出来了,原因还在于工作后对基础没有重视,疏于练习。
说开一点,现在搜索引擎的发达确实给问题的解决带来了便利,但是久而久之,对很多东西的掌握其实并不深入。比如淘宝系的人经常分享一些linux内核IO优化相关的内容,咋看一下,原来是这样,觉得也不难嘛,其实不然,如果给一张白纸让你自己把流程画出来,讲解清楚,还有有难度的。这里问题的关键在于很多时候我们只是通过互联网的便利了解某个东西,实际上并不掌握它。
纸上得来终觉浅,绝知此事要躬行。古人早就把道理告诉了我们,只是知易行难而已。
现在IT界新语言、新概念层出不穷,我也很喜欢玩这些新的东西并乐在其中,不过基础始终很重要。
回到正题,以后尽量养成动手的习惯,不管东西大小,内容高深与否,都自己实际过一遍,在博客里记录下来。
问题:将两个已排序数组合并成一个排序数组
这里先不考虑大数据量的情况(在数据量很大时不知大家有什么好的思路或方法?),只做简单数组的处理。
简单代码如下:
说明:之所以把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;
}
两个已排序数组的合并-C语言的更多相关文章
- 两个已排序数组进行合并后的第K大的值--进军硅谷
我看到此题时,首先想到一个一个比较遍历过去,这是最暴力的方法,后面我想到了已经排序,那么对每个数组进行二分,然后比较这两个值.此书第三种解法,挺不错,只对那个长度较小的数组进行二分查找,保证i+j-1 ...
- leetcode 题解:Merge Sorted Array(两个已排序数组归并)
题目: Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume ...
- LeetCode第[88]题(Java):Merge Sorted Array(合并已排序数组)
题目:合并已排序数组 难度:Easy 题目内容: Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as ...
- 剑指Offer15 合并两个已排序链表
/************************************************************************* > File Name: 15_MergeT ...
- LeetCode第[4]题(Java):Median of Two Sorted Arrays (俩已排序数组求中位数)——HARD
题目难度:hard There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median ...
- C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数
数字在已排序数组中出现的次数 提交网址: http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&t ...
- leetcode题解:Search for a Range (已排序数组范围查找)
题目: Given a sorted array of integers, find the starting and ending position of a given target value. ...
- 求两个等长的已排序数组的中位数(《算法导论》P113习题9.3-8)
[问题]设X[1...n]和Y[1...n]为两个数组,每个都包含n个已排序好的数.给出一个求数组X和Y中所有2n个元素的中位数的.O(lgn)时间的算法. [解析]O(lgn)的时间复杂度就是二分查 ...
- comm - 逐行比较两个已排序的文件
总览 (SYNOPSIS) ../src/comm [OPTION]... LEFT_FILE RIGHT_FILE 描述 (DESCRIPTION) 逐行比较 已排序的 文件 LEFT_FILE 和 ...
随机推荐
- skynet源码阅读<3>--网关分析
继上一篇介绍了skynet的网络部分之后,这一篇以网关gate.lua为例,简单分析下其串接和处理流程. 在官方给出的范例中,是以examples/main.lua作为启动脚本的,在此过程中会创建wa ...
- [Selenium] 如何绕过 IE 的安全模式
自从 IE7 引入 Protected Mode 以来, IE 浏览器的安全性的确得到了一定程度的提高.其原理从本质来讲,在浏览某些需要启用保护模式的页面时,会开启一个新的浏览器会话以完成任务,而此时 ...
- jsch文件下载功能
转载:http://www.cnblogs.com/longyg/archive/2012/06/25/2561332.html 上一篇讲述了使用JSch实现文件上传的功能,这一篇主要讲述一下JSch ...
- MyBatis学习 之 四、动态SQL语句
有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysq ...
- 关于return
return ; 相当于执行完跳转url后停止,return无返回值仅作停止作用,是指停止当前方法,是方法的终点 return null ; 代表引用类型的空值
- C#使用SendMessage发送组合键
有时需要出发菜单功能,例如发送ALT + F打开应用程序的文件菜单,如何使用SendMessage实现呢? 使用用spy++截取的ALT+F的消息内容(如何使用spy++,请熟悉的高手指点下,我使用s ...
- 国外1.5免费空间000webhost申请方法
空间大小:1500M 支持语言:PHP 数 据 库:MYSQL 国家/地区:国外 申请地址:http://www.000webhost.com/ 1500M/100GB/PHP/MYSQL/FTP ...
- C# 利用Aspose.Words .dll将本地word文档转化成pdf(完美破解版 无水印 无中文乱码)
下载Aspose.Words .dll http://pan.baidu.com/s/1c8659k 在vs2010中新建窗体应用程序,命名为 wordtopdf 添加Aspose.Words .d ...
- Logback中%X的使用
1. 参考资料 https://gist.github.com/logogin/ff44c254f655340b653c http://www.cnblogs.com/zhudongchang/p/6 ...
- 黑马传智JavaEE57期 2019最新基础+就业+在职加薪_汇总
黑马传智JavaEE57期 2019最新基础+就业+在职加薪 阶段1 语言基础+高级· 1-1-Java基础语法 第14节 数组 111