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;
}