算法-合并两个有序的数

给定两个有序的数组arr1和arr2,将两个数组合并成一个新的有序数组
示例:

left_arr={1,4,7,9,19,25}
right_arr={3,5,7,14,26,37,49,50}
合并之后:
arr3={1,3,4,7,7,9,14,19,25,26,37,49,50}

-思路:定一个一个边长的数据,长度为两个数组的长之和;设想把两个数组分别左右顺序排序,然后同时遍历两个数组,对比left_arr[i]和right_arr[j]两个数,开始进行左右两个小的那个组放到arr3中,并且小的那边的数组index+1,而大的那边数据index不变,以此不停进行交替遍历,直至不能遍历为止,如果遇到左右两个数相等,则同时放到arr3中并且两个数组的index都+1,如果一方先遍历结束,怎该方数组不在index+1,另一方的数据以此放入arr3,左右数组都遍历结束则停止遍历,合并完毕,如下图:算法-合并两个有序的数_第1张图片
代码实现如下(Java):

public static void main(String[] args) {
        int[] left_arr={1,4,7,9,19,25};
        int[] right_arr={3,5,7,14,26,37,49,50};
        int i=0,j=0,arrL1=left_arr.length,arrL2=right_arr.length;
        int[] arr3=new int[arrL1+arrL2];
        int left=0,right=0,currentInsertIndex=0;
        while (i<=arrL1&&j<=arrL2){
            if(i<arrL1&&j<arrL2){
                left=left_arr[i];
                right=right_arr[j];
                if(left>right){
                    arr3[currentInsertIndex]=right;
                    j++;
                }else if(left==right){
                    arr3[currentInsertIndex]=left;
                    arr3[currentInsertIndex+1]=right;
                    currentInsertIndex++;
                    i++;j++;
                }else {
                    arr3[currentInsertIndex]=left;
                    i++;
                }
            }else if(i==arrL1&&j<arrL2){
                arr3[currentInsertIndex]=right_arr[j];
                j++;
            }else if(j==arrL2&&i<arrL1){
                arr3[currentInsertIndex]=left_arr[i];
                i++;
            }else{
                break;
            }
            currentInsertIndex++;
        }
        for(int a:arr3){
            System.out.printf(" "+a);
        }
    }
  • 说明:看到这个题目,想到一个SQL连接方式sort merge Join,在Oracle,SQLServer ,Hive等数据库均有这个join方法(其他常见的连接方式Nested Loop Join、Merge Join、Hash Join,有兴趣可以去搜一下),底层原理跟这个基本类似

你可能感兴趣的:(Java,数据库,算法)