我的任务是使用用户填充的int数组合并两个数组,我们必须假设用户最多有10000个输入,用户输入负数停止。然后将数组从最小到最大排序并打印出来。起初我以为这很容易,但当我完成时,我开始得到如下输出:
Enter the values for the first array, up to 10000 values, enter a negative number to quit: 1
3
5
-1
Enter the values for the second array, up to 10000 values, enter a negative number to quit
2
4
6
-1
First Array:
1
3
5
Second Array:
2
4
6
Merged Array:
6 1 2 3 4 5
正如你所看到的,这六个是不合适的,我不知道如何修复它。这是源代码,我已经包括了大量的评论,因为我真的希望你们能帮助我尽你们最大的能力。如果可以使用相同的技术而不在代码中实现新的技术和方法,请这样做。我知道java中有一些方法可以在一行中完成所有这一切,但它是用于更基本级别的赋值。
import java.util.Scanner;
public class Merge
{
public static void main(String [] args)
{
Scanner scan = new Scanner(System.in);
int [] first = new int[10000]; //first array, assume 10k inputs max
int [] second = new int[10000]; //first array, assume 10k inputs max
boolean legal = true; //WILL IMPLIMENT LATER
int end = 0; // set how many elements to put in my "both" array
int end2 = 0;// set how many elements to put in my "both" array
System.out.print("Enter the values for the first array, up to 10000 values, enter a negative number to quit");
//get values
for(int i = 0; i<first.length; i++)
{
first[i] = scan.nextInt(); //fill first with user input
if(first[i] <0) //if negative number, stop loop
{
end = i; //get position of end of user input
break;
}
}
System.out.println("Enter the values for the second array, up to 10000 values, enter a negative number to quit");
for(int i = 0; i<second.length; i++) //exact same as the first get values loop
{
second[i] = scan.nextInt();
if(second[i] <0)
{
end2 = i;
break;
}
}
System.out.print("First Array:\n");
for(int i = 0; i<first.length; i++) //print first array
{
if(i == end) //this prevents from printing thousands of zeros, only prints values that user inputed
break;
System.out.println(first[i] + " ");
}
System.out.print("Second Array:\n");
for(int i = 0; i<second.length; i++) //same as printing first array
{
if(i == end2)
break;
System.out.println(second[i] + " ");
}
int [] both = new int[(end)+(end2)]; //instanciate an int array to hold only inputted values from first[] and second[]
int [] bothF = new int[(end)+(end2)]; //this is for my simple sorter algotithm loop
for(int i = 0; i<both.length; i++) //fill both with the first array that was filled
{
both[i] = first[i];
}
int temp = end; // see below
for(int i = 0;i<both.length; i++) //fill array with the second array that was filled(starting from the end of the first array so that the first set is not overwritten
{
if(temp<both.length){ //this prevents an out of bounds
both[temp] = second[i];
temp++;}
}
//simple sorting algorithm
for(int d = both.length -1;d>=0;d--)
{
for(int i = 0; i<both.length; i++)
{
if(both[d]<both[i])
{
bothF[d] = both[d];
both[d] = both[i];
both[i] = bothF[d];
}
}
}
System.out.println("Merged Array:"); //print the results
for(int i = 0; i<both.length; i++)
{
System.out.print(both[i] + " ");
}
//System.out.println("ERROR: Array not in correct order");
}
首先,我将从一些建议开始:
现在来看主要问题——为什么不将两个数组中的数字插入到join数组中,以保持它们的排序?
指导:
>
如果arr1[marker1],则迭代新的联接数组
(别忘了选择如果两者相等会发生什么情况)。
这可以实现,因为数组首先被排序。
好好练习!
当然,你可以这样做
for (int i = 0; i < end; i++) {
both[i] = first[i];
}
for (int i = 0; i < end2; i++) {
both[i + end] = second[i];
}
// simple sorting algorithm
for (int d = both.length - 1; d >= 0; d--) {
for (int i = 0; i < d; i++) {
if (both[i] > both[d]) {
int t = both[d];
both[d] = both[i];
both[i] = t;
}
}
}
产出-
Enter the values for the first array, up to 10000 values, enter a negative number to quit3
5
-1
Enter the values for the second array, up to 10000 values, enter a negative number to quit
2
4
6
-1
First Array:
3
5
Second Array:
2
4
6
-1
Merged Array:
2 3 4 5 6
你的排序算法有问题。
它类似于选择排序,在这一点上,你可以选择两个元素,如果它们不合适,就交换它们。但是,在应该停止比较的时候不要停止:当索引d
小于索引i
时,比较和交换基于arr[d]
内部循环应以
i=d
终止。
你这种人的逻辑是这样的:
在第d个循环中,
d1
和右边的元素被正确排序(较大的数字)。这在开头是正确的,因为在最右边的元素的右边有0个元素被正确排序。
在每个外部循环上(使用
d
计数器),将第d个最大的元素槽
与每个未排序的元素进行比较,如果另一个元素较大,则进行交换。
这足以对数组进行排序,但如果您开始将
d个最大元素槽
与其右侧已排序的元素进行比较,则槽中的数字最终会比应该的大。因此,内部循环应该在到达d
时终止。
我第一次用一个辅助数组实现了合并排序,以尝试使用JavaScript实现可视化。这似乎应该是有效的,但它不是。任何帮助或提示将不胜感激。 编辑:我忘了包括它不起作用的情况。它们是: 输入:[4, 2, 5, 6, 7, 7]输出:[4, 2, 5, 6, 7, 7] 输入:[6,6,6,4,6,2]输出:[4,6,6,6,6,2] 输入:[6, 7, 3, 10, 7, 9, 6, 3, 4, 6
我正在尝试用Java制作一个与OpenGL(使用LWJGL 2)的窗口。当我尝试运行时,Eclipse BuiltInclassLoader出现了ClassNotFoundException错误。 我期望输出显示一个窗口,这是真正的输出: 线程“main”java.lang.noClassDeffounder中的异常错误:org/lwjgl/lwjglexception在enginetester.
为什么会引发主线程上的网络异常?its在异步任务上 } 编辑: 完整代码: logcat:
我试图实现一个MergeSort递归算法来对一个数组进行排序,但是我一直在合并部分遇到这个问题,我不明白为什么会出现这个错误: 线程“main”中的异常 java.lang.OutOfMemory错误:Java 堆空间 它在第 21 行标记错误 这是合并部分的代码,递归部分似乎没有问题 有人能帮帮我吗?我已经试着重新检查代码,但似乎没有任何帮助。 编辑:已经尝试扩展内存,仍然抛出这个错误
我正在使用python 2.7。win8上的9。当我尝试使用matplotlib绘图时,出现以下错误: 从pylab导入* 绘图([1,2,3,4]) [matplotlib.lines.Line2D对象位于0x0392A9D0] 我尝试了测试代码“python simple_plot.py--verbose help”,出现了以下警告: $HOME=C:\Users\XX matplotlib数
错误:第 1 行的解析错误:函数搜索(sour ^ 期望“字符串”、“数字”、“空”、“真”、“假”、“{”、“[”,得到“未定义” 代码: