GVKun编程网logo

PHP实现合并两个有序数组的方法分析(php实现合并两个有序数组的方法分析数据结构)

16

如果您对PHP实现合并两个有序数组的方法分析和php实现合并两个有序数组的方法分析数据结构感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解PHP实现合并两个有序数组的方法分析的各种细节,并对ph

如果您对PHP实现合并两个有序数组的方法分析php实现合并两个有序数组的方法分析数据结构感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解PHP实现合并两个有序数组的方法分析的各种细节,并对php实现合并两个有序数组的方法分析数据结构进行深入的分析,此外还有关于C算法--合并两个有序数组、java 合并两个有序数组、java 如何用一个循环实现两个有序数组合并成一个有序数组、JavaScript 合并两个有序数组, 在有序数组中查找目标元素索引的实用技巧。

本文目录一览:

PHP实现合并两个有序数组的方法分析(php实现合并两个有序数组的方法分析数据结构)

PHP实现合并两个有序数组的方法分析(php实现合并两个有序数组的方法分析数据结构)

本文实例讲述了PHP实现合并两个有序数组的方法。分享给大家供大家参考,具体如下:

$arr1 = array(1,2,3,4,5,6,7,8);
$arr2 = array(3,4,5,7,9,10);
//方法1
function mergeOrderly1($arr1,$arr2){
 $i=0;$j=0;
 $int = array();
 while($i<count($arr1) && $j<count($arr2)){
  $int[] = $arr1[$i]<$arr2[$j]?$arr1[$i++]:$arr2[$j++];
 }
 while($i<count($arr1)){
  $int[] = $arr1[$i++];
 }
 while($j<count($arr2)){
  $int[] = $arr2[$j++];
 }
 //$int = array_merge($int,array_slice($arr1,$i));
 //$int = array_merge($int,array_slice($arr2,$j));
 return $int;
}
//方法2
function mergeOrderly2($arr1,$arr2){
 $arr = array();//定义最终数组容器
 $arr2Num = count($arr2);//统计数组长度
 $arr1Num = count($arr1);
 $i1 = 0;//数组1 的循环标记
 $i2 = 0;//数组2 的循环标记
 while($i1 < $arr1Num || $i2 < $arr2Num){//是否还需要合并
  if($i1 < $arr1Num && $i2 < $arr2Num){//当两个数组都没有到达末尾,情况一
   if($arr1[$i1] > $arr2[$i2]){//需要比较数组1和数组2,小的放入目标数组,并且标记+1
    $arr[] = $arr2[$i2];
    $i2++;
   }else{
    $arr[] = $arr1[$i1];
    $i1++;
   }
  }elseif($i1 < $arr1Num && $i2 >= $arr2Num){//数组2 已经到达末尾,而数组1还为到达,情况二
   $arr[] = $arr1[$i1];//直接把数组1的内容插入到目标数组中
   $i1++;
  }elseif($i2 < $arr2Num && $i1 >= $arr1Num){//数组1已经到达末尾,而数组2还未到达,情况三
   $arr[] = $arr2[$i2];//直接把数组2的内容插入到目标数组中
   $i2++;
  }
 }
 return $arr;
}
print_r(mergeOrderly1($arr1,$arr2));
print_r(mergeOrderly2($arr1,$arr2));

运行结果:

Array
(
 [0] => 1
 [1] => 2
 [2] => 3
 [3] => 3
 [4] => 4
 [5] => 4
 [6] => 5
 [7] => 5
 [8] => 6
 [9] => 7
 [10] => 7
 [11] => 8
 [12] => 9
 [13] => 10
)
Array
(
 [0] => 1
 [1] => 2
 [2] => 3
 [3] => 3
 [4] => 4
 [5] => 4
 [6] => 5
 [7] => 5
 [8] => 6
 [9] => 7
 [10] => 7
 [11] => 8
 [12] => 9
 [13] => 10
)

细心的读者应该发现了,合并后的数组并没有去重复。下面介绍一下数组合并后去重复的方法:

1. 单数组去重复

array_unique($arrTest)

2. 多数组去重复

array_keys(array_flip($arr1)+array_flip($arr2))

测试示例:

$arr1 = array(1,2,3,4,5);
$arr2 = array(1,2,3,6,7);
$arr3 = array(''0''=>1,''1''=>2,''2''=>3,''3''=>4,''4''=>5);
$arr4 = array(''0''=>1,''1''=>2,''2''=>3,''3''=>6,''4''=>7);
$arr5 = array(''0''=>1,''a''=>2,''b''=>3,''c''=>4,''4''=>5);
$arr6 = array(''0''=>1,''a''=>2,''c''=>3,''d''=>6,''4''=>7);
var_dump(array_merge($arr1, $arr2));
var_dump($arr1+$arr2);
var_dump(array_keys(array_flip($arr1)+array_flip($arr2)));
echo ''<br>'';
var_dump(array_merge($arr3, $arr4));
var_dump($arr3+$arr4);
var_dump(array_keys(array_flip($arr3)+array_flip($arr4)));
echo ''<br>'';
var_dump(array_merge($arr5, $arr6));
var_dump($arr5+$arr6);

运行结果:

array(10) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(1) [6]=> int(2) [7]=> int(3) [8]=> int(6) [9]=> int(7) } array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) } array(7) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) } 
array(10) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(1) [6]=> int(2) [7]=> int(3) [8]=> int(6) [9]=> int(7) } array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) } array(7) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) [5]=> int(6) [6]=> int(7) } 
array(8) { [0]=> int(1) ["a"]=> int(2) ["b"]=> int(3) ["c"]=> int(3) [1]=> int(5) [2]=> int(1) ["d"]=> int(6) [3]=> int(7) } array(6) { [0]=> int(1) ["a"]=> int(2) ["b"]=> int(3) ["c"]=> int(4) [4]=> int(5) ["d"]=> int(6) } 

更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数组(Array)操作技巧大全》、《PHP数学运算技巧总结》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《PHP常用遍历算法与技巧总结》、《PHP数据结构与算法教程》及《php程序设计算法总结》

希望本文所述对大家PHP程序设计有所帮助。

您可能感兴趣的文章:
  • PHP实现统计一个数字在排序数组中出现次数的方法
  • PHP实现找出有序数组中绝对值最小的数算法分析
  • php实现有序数组打印或排序的方法【附Python、C及Go语言实现代码】
  • php实现按照权重随机排序数据的方法
  • php实现有序数组旋转后寻找最小值方法

C算法--合并两个有序数组

C算法--合并两个有序数组

第一:题目描述

1. 将两个整型且有序的数组,合并为一个新的数组。
2. 合并后的数组仍为有序数组。
3. 第一个数组有足够的空间来存放第二个数组。
4. 要求时间复杂度为O(M+N)

第二:思路

1. 用malloc函数开辟一个两个数组总长度的连续空间arr
2. 从第一个元素开始,依次比较两个数组中的每个元素。
3. 将较小值保存到新开辟的数组中
4. 并将较小值对应数组的当前索引向后移动一个元素,同时将开辟数组的索引也向后移动一个元素。
5. 这样只需要对每个数组遍历一遍即可,即时间复杂度为O(M+N),空间复杂度为O(M+N),即用空间换时间的策略。

第三:代码实现

复制
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    // 如果第一个数组的长度为0,则直接将第二个数组拷贝到第一个数组中去
    if (m == 0)
    {
        while (n--)
        {
            nums1[n] = nums2[n];
        }
        return;
    }
    // 动态开辟一个两个数组总元素个数 * int的内存空间
    int* arr = (int*)malloc(sizeof(int) * (m + n));
    if (NULL == arr)
    {
        printf("内存开辟失败\n");
        return;
    }

    // i j k 分别为第一个、第二个、开辟动态数组的索引
    int i = 0, j = 0, k = 0;
    // 从第一个和第二个数组的第一个位置开始遍历
    // 依次比较两个数组当前索引的两个值的大小,将较小值保存到第三个数组中。
    // 将较小值对应的索引和第三个数组的索引向后移动一个元素。
    // 直到第一和第二个数组中有一个超出输出索引范围。
    while (i < m && j < n)
    {
        if (nums1[i] < nums2[j])
        {
            arr[k] = nums1[i];
            i++;
        }
        else
        {
            arr[k] = nums2[j]www.;
            j++;
        }
        k++;
    }
    // 第一个数组没有遍历完。
    while (i < m)
    {
        arr[k] = nums1[i];
        k++;
        i++;
    }
    // 第二个数组没有遍历完。
    while (j < n)
    {
        arr[k] = nums2[j];
        k++;
        j++;
    }
    // 将第三个数组的数据拷贝到第一个数组中
    while (k--)
    {
        nums1[k] = arr[k];
    }
    // 释放动态开辟的内存空间
    free(arr);
    arr = NULL;
}

int main()
{
    int i;
    int arr1[1000] = { 1,4,6 };
    int len1 = sizeof(arr1) / sizeof(arr1[0]);
    int arr2[] = { 2,3,7 };
    int len2 = sizeof(arr2) / sizeof(arr2[0]);
    int m = 3;

    // 测试第一个数组的元素有三个
    //merge(arr1, len1, m, arr2, len2, len2);
    //for (i = 0; i < m + len2; i++) { printf("%d ", arr1[i]); }
    //printf("\n");

    // 测试第一个数组的元素有两个
    m = 2;
    merge(arr1, len1, m, arr2, len2, len2);
    for (i = 0; i < m+ len2; i++) { printf("%d ", arr1[i]); }
    printf("\n");
}

 

 

java 合并两个有序数组

java 合并两个有序数组

package base;

/**
 * java 合并两个有序数组
 */
public class MergeTwoArray {
    public static void main(String[] args) {
        int[] arrayA = {100,200,201,334};
        int[] arrayB = {101,104,106,233,455,772};
        int[] arrayC = new int[arrayA.length + arrayB.length];
        merge(arrayA,arrayA.length,arrayB,arrayB.length,arrayC);
        disPlay(arrayC);
    }

    public static void merge(int[] arrayA, int sizeA, int[] arrayB, int sizeB,int[] arrryC) {
        int aIndex = 0, bIndex = 0,cIndex = 0;
        while (aIndex < sizeA && bIndex < sizeB) {
            if(arrayA[aIndex] < arrayB[bIndex]) {
                arrryC[cIndex ++] = arrayA[aIndex++];
            } else {
                arrryC[cIndex ++] = arrayB[bIndex++];
            }
        }
        while (aIndex < sizeA) {
            arrryC[cIndex ++] = arrayA[aIndex++];
        }
        while (bIndex < sizeB) {
            arrryC[cIndex ++] = arrayB[bIndex ++];
        }
    }

    public static void disPlay(int[] arryx) {
        for(int i = 0; i < arryx.length; i ++) {
            System.out.print(arryx[i] + " ");
        }
        System.out.println();
    }
}

 

java 如何用一个循环实现两个有序数组合并成一个有序数组

java 如何用一个循环实现两个有序数组合并成一个有序数组

如题,代码如下:

public void paixu() {
        int[] a = { 1, 3, 5 };
        int[] b = { 2, 3, 4, 7 };
        int l = a.length + b.length;
        int[] temp = new int[l];
        int i = 0, j = 0, h = 0;
        // 这里必须用while,不能用for
        while (i < a.length || j < b.length) {
            if (i == a.length && j < b.length) {
                temp[h++] = b[j++];
            } else if (i < a.length && j == b.length) {
                temp[h++] = a[i++];
            } else if (a[i] <= b[j]) {
                temp[h++] = a[i++];
            } else if (a[i] > b[j]) {
                temp[h++] = b[j++];
            }
        }
        for (int m : temp) {
            System.out.print(m + "  ");
        }
    }

 

JavaScript 合并两个有序数组, 在有序数组中查找目标元素索引

JavaScript 合并两个有序数组, 在有序数组中查找目标元素索引

合并两个有序数组


function merge(nums1, nums2) {
  var len1 = nums1.length - 1;
  var len2 = nums2.length - 1;
  var len = nums1.length + nums2.length - 1;

  while (len1 >= 0 && len2 >= 0) {
    nums1[len--] = nums1[len1] > nums2[len2] ? nums1[len1--] : nums2[len2--];
  }
  return nums1;
}
输入
[1, 2, 3] [2, 4, 5, 6, 7, 8, 9]
输出
[1, 2, 2, 3, 4, 5, 6, 7, 8, 9]

解析

  1. 获取数组1,数组2以及合并之后的数组的长度
  2. 从后遍历比较,当len1或len2为0的时候退出

    序号 len1 len2 len nums1[len1] nums2[len2] nums
    1 2 6 9 3 9 [1, 2, 3, empty*6, 9]
    2 2 5 8 3 8 [1, 2, 3, empty*5, 8, 9]
    3 2 4 7 3 7 [1, 2, 3, empty*4, 7, 8, 9]
    4 2 3 6 3 6 [1, 2, 3, empty*3, 6, 7, 8, 9]
    5 2 2 5 3 5 [1, 2, 3, empty*2, 5, 6, 7, 8, 9]
    6 2 1 4 3 4 [1, 2, 3, empty*1, 4, 5, 6, 7, 8, 9]
    7 1 1 3 3 2 [1, 2, 3, 3, 4, 5, 6, 7, 8, 9]
    8 0 1 2 2 2 [1, 2, 2, 3, 4, 5, 6, 7, 8, 9]

在有序数组中查找目标元素索引


function search(arr, num) {
  var start = 0, end = arr.length - 1;

  while (start <= end) {
    var mid = Math.floor((start + end) / 2);
    if (num < arr[mid])  end = mid - 1;
    else if (num > arr[mid])  start = mid + 1;
    else return mid;
  }
  return -1;
}

取中间值,判断目标元素是在中间值的左边还是右边,对开始索引和结束索引进行更改

今天关于PHP实现合并两个有序数组的方法分析php实现合并两个有序数组的方法分析数据结构的分享就到这里,希望大家有所收获,若想了解更多关于C算法--合并两个有序数组、java 合并两个有序数组、java 如何用一个循环实现两个有序数组合并成一个有序数组、JavaScript 合并两个有序数组, 在有序数组中查找目标元素索引等相关知识,可以在本站进行查询。

本文标签: