两个已排序数组的合并-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 和 ...
随机推荐
- html5--6-23 CSS3中的文字与字体
html5--6-23 CSS3中的文字与字体 text-overflow 设置是否使用一个省略标记(...)标示对象内文本的溢出 clip: 默认值当对象内文本溢出时不显示省略标记(...),而是将 ...
- 使用pngcrush压缩png图片
写在前面: Pngcrush是一个优化的PNG(便携式网络图形)文件.它可以运行在MSDOS窗口中一个命令行,或从UNIX或LINUX命令行.其主要目的是为了 减少PNG IDAT数据 ...
- Sorting a Three-Valued Sequence
链接 分析:首先我们先对其进行排序,并看排序以后有多少个元素顺序是对的,接着我们看有多少个元素经过一次交换可以得到的,最后剩下的元素就是经过两次交换可以得到的了. /* PROB:sort3 ID:w ...
- 【POJ 1961】 Period
[题目链接] 点击打开链接 [算法] KMP 和POJ2406很像 [代码] #include <algorithm> #include <bitset> #include & ...
- linux/unix下 pid文件作用浅析
l在linux系统的目录/var/run下面一般我们都会看到很多的*.pid文件.而且往往新安装的程序在运行后也会在/var/run目录下面产生自己的pid文件.那么这些pid文件有什么作用呢?它的内 ...
- Vue HTML5 History 模式
vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. 如果不想要很丑的 hash,我们可以用路由的 his ...
- Python2/3共存,pip2/3共存
python2 和 python3设置: 1.安装Python2和3,并添加环境变量: 2.找到python2和python3的安装目录,修改python2中和python3中python.exe和p ...
- Struts2基本使用
Struts2:本质servlet 1.接受页面参数 a.使用原生的ServletAPI接受(不推荐) request.getParameter(name) 获取元素request方式: --Http ...
- hdoj2159【二位费用背包】
题意: 略: 推荐看一下那个背包九讲,第五讲非常清晰啊. 原文: 算法 费用加了一维,只需状态也加一维即可.设f[i][v][u]表示前i件物品付出两种代价分别为v和u时可获得的最大价值.状态转移方程 ...
- IT兄弟连 JavaWeb教程 经典面试题3
1.简述什么是重定向? 服务器向浏览器发送—个302状态码及一个Location消息头(该消息头的值是一个地址,称之为重定向地址),浏览器收到后会立即向重定向地址发出请求. 2.简述什么是转发?怎么实 ...