我是新来的Java,并试图用Java来实现归并。然而,即使在运行,而不是期望的有序输出方案几次后,我正在给定的输入与输出相同的用户。我会感激,如果有人可以帮助我了解这个意外的行为。
进口java.io. *;
进口java.util.Arrays中;
公共类归并{
公共静态无效的主要(字串[] args)抛出IOException异常{
BufferedReader中R =新的BufferedReader(新的InputStreamReader(System.in));
INT ARRAYSIZE =的Integer.parseInt(R.readLine());
INT [] inputArray =新INT [ARRAYSIZE]
的for(int i = 0; I< ARRAYSIZE;我++){
inputArray [I] =的Integer.parseInt(R.readLine());
}
归并(inputArray);
对于(INT J = 0; J< inputArray.length; J ++){
的System.out.println(inputArray [J]);
}
}
静态无效归并(INT [] A){
如果(则为a.length→1){
INT Q =则为a.length / 2;
INT [] leftArray = Arrays.copyOfRange(A,O,Q);
INT [] rightArray = Arrays.copyOfRange(A,Q + 1,则为a.length);
归并(leftArray);
归并(rightArray);
A =合并(leftArray,rightArray);
}
}
静态INT []合并(INT [] L,INT [] R){
INT totElem = l.length + r.length;
INT [] A =新的INT [totElem]
INT I,李里;
I =李= RI = 0;
而(I< totElem){
如果((LI< l.length)及及(RI< r.length)){
如果(L [李]< R [RI]){
A [1] = L [李]
我++;
李++;
}
其他 {
A [1] = R [RI]
我++;
RI ++;
}
}
其他 {
如果(LI> = l.length){
而(RI< r.length){
A [1] = R [RI]
我++;
RI ++;
}
}
如果(RI> = r.length){
而(LI< l.length){
A [1] = L [李]
李++;
我++;
}
}
}
}
返回;
}
}
解决方案
下面是你的code修正版本:
进口java.io. *;
进口java.util.Arrays中;
公共类归并{
公共静态无效的主要(字串[] args)抛出IOException异常{
BufferedReader中R =新的BufferedReader(新的InputStreamReader(System.in));
INT ARRAYSIZE =的Integer.parseInt(R.readLine());
INT [] inputArray =新INT [ARRAYSIZE]
的for(int i = 0; I< ARRAYSIZE;我++){
inputArray [I] =的Integer.parseInt(R.readLine());
}
归并(inputArray);
对于(INT J = 0; J< inputArray.length; J ++){
的System.out.println(inputArray [J]);
}
}
静态无效归并(INT [] A){
如果(则为a.length→1){
INT Q =则为a.length / 2;
INT [] leftArray = Arrays.copyOfRange(A,O,Q);
INT [] rightArray = Arrays.copyOfRange(A,Q,则为a.length);
归并(leftArray);
归并(rightArray);
合并(A,leftArray,rightArray);
}
}
静态无效的合并(INT []一,INT [] L,INT [] R){
INT totElem = l.length + r.length;
// INT [] A =新的INT [totElem]
INT I,李里;
I =李= RI = 0;
而(I< totElem){
如果((LI< l.length)及及(RI< r.length)){
如果(L [李]< R [RI]){
A [1] = L [李]
我++;
李++;
}
其他 {
A [1] = R [RI]
我++;
RI ++;
}
}
其他 {
如果(LI> = l.length){
而(RI< r.length){
A [1] = R [RI]
我++;
RI ++;
}
}
如果(RI> = r.length){
而(LI< l.length){
A [1] = L [李]
李++;
我++;
}
}
}
}
//返回;
}
}
I am new to Java and have tried to implement mergesort in Java. However, even after running the program several times, instead of the desired sorted output, I am getting the same user given input as the output. I would be thankful if someone could help me understand this unexpected behaviour.
import java.io.*;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) throws IOException{
BufferedReader R = new BufferedReader(new InputStreamReader(System.in));
int arraySize = Integer.parseInt(R.readLine());
int[] inputArray = new int[arraySize];
for (int i = 0; i < arraySize; i++) {
inputArray[i] = Integer.parseInt(R.readLine());
}
mergeSort(inputArray);
for (int j = 0; j < inputArray.length; j++) {
System.out.println(inputArray[j]);
}
}
static void mergeSort(int[] A) {
if (A.length > 1) {
int q = A.length/2;
int[] leftArray = Arrays.copyOfRange(A, 0, q);
int[] rightArray = Arrays.copyOfRange(A,q+1,A.length);
mergeSort(leftArray);
mergeSort(rightArray);
A = merge(leftArray,rightArray);
}
}
static int[] merge(int[] l, int[] r) {
int totElem = l.length + r.length;
int[] a = new int[totElem];
int i,li,ri;
i = li = ri = 0;
while ( i < totElem) {
if ((li < l.length) && (ri<r.length)) {
if (l[li] < r[ri]) {
a[i] = l[li];
i++;
li++;
}
else {
a[i] = r[ri];
i++;
ri++;
}
}
else {
if (li >= l.length) {
while (ri < r.length) {
a[i] = r[ri];
i++;
ri++;
}
}
if (ri >= r.length) {
while (li < l.length) {
a[i] = l[li];
li++;
i++;
}
}
}
}
return a;
}
}
解决方案
Here is a corrected version of your code:
import java.io.*;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) throws IOException{
BufferedReader R = new BufferedReader(new InputStreamReader(System.in));
int arraySize = Integer.parseInt(R.readLine());
int[] inputArray = new int[arraySize];
for (int i = 0; i < arraySize; i++) {
inputArray[i] = Integer.parseInt(R.readLine());
}
mergeSort(inputArray);
for (int j = 0; j < inputArray.length; j++) {
System.out.println(inputArray[j]);
}
}
static void mergeSort(int[] A) {
if (A.length > 1) {
int q = A.length/2;
int[] leftArray = Arrays.copyOfRange(A, 0, q);
int[] rightArray = Arrays.copyOfRange(A,q,A.length);
mergeSort(leftArray);
mergeSort(rightArray);
merge(A,leftArray,rightArray);
}
}
static void merge(int[] a, int[] l, int[] r) {
int totElem = l.length + r.length;
//int[] a = new int[totElem];
int i,li,ri;
i = li = ri = 0;
while ( i < totElem) {
if ((li < l.length) && (ri<r.length)) {
if (l[li] < r[ri]) {
a[i] = l[li];
i++;
li++;
}
else {
a[i] = r[ri];
i++;
ri++;
}
}
else {
if (li >= l.length) {
while (ri < r.length) {
a[i] = r[ri];
i++;
ri++;
}
}
if (ri >= r.length) {
while (li < l.length) {
a[i] = l[li];
li++;
i++;
}
}
}
}
//return a;
}
}