导航:首页 > 源码编译 > 两个有序数组合并算法

两个有序数组合并算法

发布时间:2023-04-28 02:50:53

A. 两个已经排序的数组如何合并成一个新的有序数组

改一下排序函数就可以了。就可以不用每次去比较所宏配有元素了。void MergeArray(int* a, int size1, int* b, int size2, int* c, int size3)/*将数组递增数组a,b合并成递减数尘绝戚组c,size1,size2,size3分别是a,b,c数组的大小*/
{
int i = 0, j = 0, k = 0;

int temp = 0;

k = size3 - 1; /*数组c最后一个元素空间*/

while(i<size1||j<size2)
{
/*比较a,b数组当前值,取出较小元素,保存到数组派陵c中(小值在数组c中由后至前保存)*/

if(a[i] < b[j])
{
c[k] = a[i];
i++;
}
else
{
c[k] = b[j];
j++;
}
k--;
}
}

B. 如何将两个有序数组合并为一个有序数组,用函数做,一个循环搞定

这很简单:
代码如下(此处不考虑Object,假设为int[ ]):
public int[ ] getNewArrays(int[ ] one, int [] two){
int len=one.length;
int len2=two.length;
int len3=oneLength+twoLength; //得到两数组长度和;
int[] newArray=new int [len3]; //创建第三个数组,长度=两数组长度之和;
for(int i=0;i<len3;i++){
if(i<len){ //如果i<len,则赋值为one中的元素;
newArray[i]=one[i];
continue;
}
int t=i-len; // t 从0开始
newArray[i]=two[t]; //后面的元素 赋值为two中的元素;

} //对第三个数组一一赋值,值为前两个数组;
Arrays.sort(newArray); //对第三个数组排序;此处使用的是java自带的sort方法;
//也可使用冒泡排序,此处不演示;
return newArray;
}

C. java合并两个有序数组

package com.lili.test;

import java.util.Random;
import java.util.Arrays;
/**]
* 合并两数组为一个有序数组
* @作者: lili
* @日期: Nov 9, 2009
*/
public class TestMe {

/**
* @param args
* @throws ParseException
*/
public static void main(String[] args) {

int a[] = new int[6];
int b[] = new int[6];
Random r = new Random();
for (int i = 0; i < a.length; i++) {
a[i] = r.nextInt(100);
}
for (int i = 0; i < b.length; i++) {
b[i] = r.nextInt(100);
}
System.out.println("合并前--------------------------------------");
for (int i = 0; i < a.length; i++) {
System.out.print("A[" + i + "] = " + a[i]+"\t");
}
System.out.println();
for (int i = 0; i < b.length; i++) {
System.out.print("B[" + i + "] = " + b[i]+"\t");
}
System.out.println();
System.out.println("合并前--------------------------------------");
int[] c = concatArray(a, b);
System.out.println("合并后大小:" + c.length);
for (int i = 0; i < c.length; i++) {
System.out.print("c[" + i + "] = " + c[i]+"\t");
if (i % 3 == 0 && i!=0) {
System.out.println();
}
}
}

/**
* 合并两个 int[]型数组为一个有序数组(升序)
*
* @param aArray
* @param bArray
* @return
*/
public static int[] concatArray(int[] aArray, int[] bArray) {
int[] cArray = null;
/*
* 保证参数的合法证
*/
if (aArray == null || bArray == null) {
return aArray == null ? bArray : aArray;
}
if (aArray != null && bArray != null) {
cArray = new int[aArray.length + bArray.length];
}
/*
* 合并前排序
*/
Arrays.sort(aArray);
Arrays.sort(bArray);
/*
* 各数组 的当前 index
*/
int aArray_index = 0;
int bArray_index = 0;
/*
* 开始合并
*/
for (int i = 0; i < cArray.length; i++) {
if (aArray_index > aArray.length - 1
|| bArray_index > bArray.length - 1) {
break;
} else {
int a = aArray[aArray_index];
int b = bArray[bArray_index];

if (a == getMin(a, b)) {
aArray_index++;

cArray[i] = a;
} else {
bArray_index++;
cArray[i] = b;
}
}
}
/*
* 其中一个数组被合并完毕
*/
if (aArray_index < aArray.length - 1) {
for (int i = aArray_index + bArray.length; i < cArray.length; i++) {
cArray[i] = aArray[aArray_index++];
}
} else if (bArray_index < bArray.length - 1) {
for (int i = bArray_index + aArray.length; i < cArray.length; i++) {
cArray[i] = bArray[bArray_index++];
}
}
return cArray;
}

/**
* 求两数之间比较小的一个数
*
* @param a
* @param b
* @return
*/
public static int getMin(int a, int b) {
return a - b <= 0 ? a : b;
}
}

D. 如何用C语言编程将两个有序数组a,b合并成一个数组c

就以你的例子来写,可适当修改为更普遍的

算法核心代码为:

int i = j = k = 0;
//灶敏闭循环比较,将小的插入到C数组中

while ( i < 3 && j < 3) {
if (a [i] < b [j]) c[k++] = a[i++];
else c[k++] = b[j++];

}
//处理其中一个数组剩下

while (i < 3) c[k++] = a[i++];
while( j < 3) c[k++] = b[j++];
或许有拿带更好的实隐裂现,你自己在想想吧!

E. LeetCode题解:合并两个有序数组

给你两个按非递减排序的整数数组nums1和nums2,另外有两个整数m和n,分别表示nums1和nums2中的元素数目。
请你合并nums1和nums2,使合唤贺掘并后的数组同样按非递减顺序排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m+n,其中前m个元素表示应合并的元素,后n个元拍模素为0,应忽略,num2的长度为n。

输入: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出: [1,2,2,3,5,6]
解释: 需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。

复杂度分析

比较两个数组的元素大小和核,每次将比较的较大值放置到当前的最大索引的位置。如果一方提前放置完毕,那么剩下的都放置另一方的元素。

复杂度分析

F. 两个数组合并成一个有序数组

这是个很成熟的算法。

#include <闹散stdio.h>


void merge(int* a, int m, int* b, int n, int* c) {

int i,j,k;


for (i=0, j=0, k=0; (i<m||j<n)&&k<(m+n);i++,j++,k++) {

if (i>=m){

c[k] = b[j];

continue;

}


if (j>=n) {

c[k] = a[i];

continue;

}


if (a[i] > b[j]) {

c[k] = b[j];

i--;

} else {

液迟氏 c[k] =a[i];

j--;

}

}

}


int main() {

int nums1[]={1,2,3,7,8,9};

int nums2[]={4,5,6};

int nums3[9]; //保存合并结果


merge(nums1, 6, nums2, 3, nums3);

for(int i=0;i<9;i++)

printf("旦没%d ",nums3[i]);

printf(" ");

return 0;

}

阅读全文

与两个有序数组合并算法相关的资料

热点内容
部队抗洪抢险命令范文 浏览:886
欧姆龙plc编程软件使用教程 浏览:592
ai文件pdf 浏览:911
腾讯云服务器挂载混合云 浏览:758
智能小车用什么单片机 浏览:463
java怎么给窗口关闭 浏览:940
列举51单片机的寻址方式 浏览:706
剪辑app怎么写长篇文字 浏览:400
app专属流量过月租怎么不更新 浏览:654
王者程序员都有谁 浏览:76
给牛换脚掌解压 浏览:387
围棋有多少种算法 浏览:602
unity资源包在哪个文件夹 浏览:704
阿里云服务器远程链接不成功 浏览:482
文件系统pdf 浏览:766
原神安卓区服什么意思 浏览:37
贝壳app怎么线上发布 浏览:160
如何挑选安卓系统机顶盒 浏览:54
安卓快充使用有什么注意事项 浏览:910
黑马程序员的云计算网课 浏览:948