如何正确合并两个排序的数组?

时间:2019-02-28 02:05:59

标签: java arrays merge

合并两个排序数组的正确方法是什么?我目前正在研究一个简短的Java程序,以合并两个已经排序的数组。请在下面找到我的代码。

import pandas as pd
import numpy as np

# read csv
df = pd.read_csv("/home/baobob/Downloads/data_v.csv", header=None)

# shift down element in column 1
df[2] = df[1].shift()

# this is doing in a vectorial way the comparative with a element 
# with is previous (which is now on the same row but in column 2)
df["quotient"] = np.where(df[1]<df[2], df[1]/df[2], np.nan)

# if we want to check the different quotients for each file 
# we use .unique()
quotients = df["quotient"].unique()

# if we want to remove nan
quotients = [q for q in quotients if not np.isnan(q)]

当前输出仅为:

public class Merge {

    // data
    private static int[] data;
    private int elements;

    // constructor
    public Merge()
    {
        data = new int[4];
        elements = 0;
    }

    // DoubleSize method doubles array size if needed
    public void DoubleSize()
    {
        int[] tmp = new int[2 * data.length];
        // transfer existing data
        for (int i = 0; i < elements; i++)
        {
            tmp[i]=data[i]; 
        }
        data = tmp;
    }

    // this methods adds to the end of an array 
    public void add(int val)    
    {
        if(elements >= data.length)
        {
            DoubleSize();
        }
        data[elements] = val;
        elements++;
    }

    // this method prints the array values
    public void print()
    {
        // for-loop to print valid data only
        for(int i = 0; i < elements; i++)
        {
            System.out.print(data[i] + " ");
        }
        System.out.println();
    }
    // this method gets a value given an index
    public int get(int loc)
    {
        return data[loc];
    }

    // set a value, given an index
    public void set(int loc, int value)
    {
        data[loc]= value;
    }

    // this method sorts the data in array in ascending order
    public void sort()
    {
        int[] tmp2 = new int[data.length];
        for(int i = 0;i < data.length; i++)
        {
            int loc = this.min();
            tmp2[i] = this.get(loc);
            data[loc] = this.get(this.max())+1;
        }
        data = tmp2;
    }

    public int[] merge(int[] data2)
    {
        int[] data3 = new int[data.length + data2.length];
        int i = 0, j = 0, k = 0; 

        // Traverse both array 
        while (i < data.length && j < data2.length) 
        { 
            // Check if current element of first 
            // array is smaller than current element 
            // of second array. If yes, store first 
            // array element and increment first array 
            // index. Otherwise do same with second array 
            if(data[i] < data2[j]) { 
                data3[k] = data[i]; 
                i++;
            }
            else {
                data3[k] = data2[j]; 
                j++;
            }

        } 

        // Store remaining elements of first array 
        while (i < data.length) {
            data3[k] = data[i]; 
            i++;
            k++;
        }

        // Store remaining elements of second array 
        while (j < data2.length) {
            data3[k] = data2[j];
            j++;
            k++;
        }
        return data3;
    }

    // main method to test our previous methods
    public static void main(String[] args)
    {
        Merge array = new Merge();

        // adding in numbers to sort 
        array.add(-7);
        array.add(2);
        array.add(4);
        array.add(9);
        array.add(13);
        array.print();  
        array.merge(new int[] {-9, 1, 6, 22});
        array.print();

    }
}

我似乎无法弄清楚为什么它不能按预期工作。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:3)

您的代码中有很多错误。

我将一个接一个地解决这些问题,而只是解释它们而未提供实际的完整解决方案-因为我怀疑您正在处理家庭作业问题。

public void DoubleSize()

功能问题(防止代码正常运行)

  • 您的代码无法编译。 this.min()中的this.max()public void sort()未定义。

  • 您的方法public int[] merge(int[] data2)返回合并的数组。但是,您永远不会对该数组执行任何操作。让该方法不返回任何内容,而是将新创建的数组设置为类(data)的成员。

  • 您不会在k的第一个循环中递增变量merge。它始终为0,这意味着您始终将其写入数组中的同一位置。

  • 合并后您不会更新变量elements

  • merge的主循环中,您要迭代i直到data.length。考虑到这包括用0填充的数组末尾。也许您想使用另一个变量?

  • merge中进行主循环之后,您正在复制data中所有剩余的元素,但是正如我们刚才所说的,它们都是0。因此,请完全跳过该部分

实施上述所有操作将产生可行的解决方案。我自己测试过

其他问题(不是故障的原因,但仍然很重要)

  • Java命名约定规定方法名称应使用小写首字母拼写。这称为“ camelCase”(您使用了“ CamelCase”)。这不是您的代码无法正常工作的原因,但这是一个好习惯。

  • 您的成员data被声明为静态。静态成员属于类,而不属于对象。您应该使该成员成为非静态成员!

  • 您严格不需要变量k,因为k == (i + j)应该始终为true。简化此操作将消除您在第一个列表中遇到的一个问题!