合并两个排序数组的正确方法是什么?我目前正在研究一个简短的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(); } }
我似乎无法弄清楚为什么它不能按预期工作。任何帮助将不胜感激!
答案 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
。简化此操作将消除您在第一个列表中遇到的一个问题!