【发布时间】:2020-03-26 15:07:50
【问题描述】:
好的,这是那些令人绝望的问题之一。我正在尝试实现自下而上的 MS 来排序和整数数组。但是,老天爷,我似乎找不到错误...
import java.util.Scanner;
public class A2 {
public static boolean less(Integer v, Integer w) {
return v.compareTo(w) < 0;
}
public static void sort(int[] a) {
int N = a.length;
int[] aux = new int[N];
for (int sz = 1; sz < N; sz = sz + sz)
for (int lo = 0; lo < N - sz; lo += sz + sz)
merge(a, aux, lo, lo + sz - 1, Math.min(lo + sz + sz - 1, N - 1));
}
public static void merge(int[] a, int aux[], int lo, int mid, int hi) {
int i = lo;
int j = mid + 1;
for (int k = lo; k <= hi; k++)
aux[k] = a[k];
for (int k = lo; k <= hi; k++)
if (i > mid)
a[k] = aux[j++];
else if (j > hi)
a[k] = aux[i++];
else if (less(aux[j], aux[i]))
a[k] = a[j++];
else
a[k] = a[i++];
}
public static void main(String[] args) {
int next = 0;
Scanner scanner = new Scanner(System.in);
int size = Integer.parseInt(scanner.nextLine());
int[] v = new int[size];
String s = scanner.nextLine();
scanner.close();
String[] sa = s.split("[\\s]+");
while (next < size) {
v[next] = Integer.parseInt(sa[next]);
next ++;
}
for (Integer i : v)
System.out.print(i + " ");
System.out.println();
System.out.println("----------------------------------");
sort(v);
for (int i = 0; i < size; i++)
System.out.print(v[i] + " ");
System.out.println();
}
}
在main 函数中,我打印了数组的元素,只是为了确定问题出在排序上。第一个数字只是数组的大小。该错误位于sort() 或merge() 中。
以下是一些示例输出:
9
10 45 20 5 -6 80 99 -4 0
10 45 20 5 -6 80 99 -4 0
----------------------------------
-6 -4 -4 -6 -4 -4 -6 0 99
6
6 7 3 2 4 1
6 7 3 2 4 1
----------------------------------
1 1 1 4 6 7
5
6 5 2 3 4
6 5 2 3 4
----------------------------------
2 3 4 5 6
最后一个看起来还不错。
请帮帮我,我一直在转来转去,似乎找不到错误。
【问题讨论】:
-
尝试在
merge方法中打印一些消息,找出问题开始的时间。使用较小的输入(4 2 1 3)进行调试。并尝试使用 [debugger] (eclipse.org/community/eclipse_newsletter/2017/june/article1.php) 提供帮助。
标签: java algorithm sorting debugging mergesort