[英]Merge Sorting a string array and an int array java
我一直在尝试进行将字符串数组和int数组排序在一起的合并排序。 int [0]指向word [0],因此,例如,当word [0]移至word [2]时,int [0]也应移至int [2]。 但是,我的输出是不同的:abcd 4 3 1 3。 我究竟做错了什么?
public static void main(String[] args) {
String[] word = {"c", "b", "d", "a"};
int[] lineNumber = {1, 2, 3, 4};
mergeSort(word, lineNumber, 0, word.length-1);
for(int i = 0; i< word.length; i++) {
System.out.print(word[i] + " ");
}
System.out.println();
for(int i =0; i < word.length; i++)
System.out.print(lineNumber[i] + " ");
}
static void mergeSort(String[] word, int[] lineNumber, int p, int r) {
int q;
if(p < r) {
q = (p+r)/2;
mergeSort(word, lineNumber, p, q);
mergeSort(word, lineNumber, q+1, r);
merge(word, lineNumber, p, q, r);
}
}
static void merge(String[] word, int[] lineNumber, int p, int q, int r) {
int n1 = q-p+1;
int n2 = r-q;
String[] lWord = new String[n1];
String[] rWord = new String[n2];
int[] lLineNum = new int[n1];
int[] rLineNum = new int[n2];
int i, j, k;
for(i=0; i<n1; i++) {
lWord[i] = word[p+i];
lLineNum[i] = lineNumber[p+i];
}
for(j=0; j<n2; j++) {
rWord[j] = word[q+j+1];
rLineNum[j] = lineNumber[q+j+1];
}
i = 0; j = 0;
for(k=p; k<=r; k++) {
if(i<n1 && j<n2) {
if(lWord[i].compareTo(rWord[j]) < 0) {
word[k] = lWord[i];
lineNumber[k] = lLineNum[i];
i++;
}else
word[k] = rWord[j];
lineNumber[k] = rLineNum[j];
j++;
}
else if(i<n1) {
word[k] = lWord[i];
lineNumber[k] = lLineNum[i];
i++;
}else if(j<n2){
word[k] = rWord[j];
lineNumber[k] = rLineNum[j];
j++;
}
}
}
问题在于merge
。 它看起来应该像这样:
static void merge(String[] word, int[] lineNumber, int p, int q, int r) {
int n1 = q-p+1;
int n2 = r-q;
String[] lWord = new String[n1];
String[] rWord = new String[n2];
int[] lLineNum = new int[n1];
int[] rLineNum = new int[n2];
int i, j, k;
for(i=0; i<n1; i++) {
lWord[i] = word[p+i];
lLineNum[i] = lineNumber[p+i];
}
for(j=0; j<n2; j++) {
rWord[j] = word[q+j+1];
rLineNum[j] = lineNumber[q+j+1];
}
i = 0; j = 0;
for(k=p; k<=r; k++) {
if(i<n1 && j<n2) {
if(lWord[i].compareTo(rWord[j]) < 0) {
word[k] = lWord[i];
lineNumber[k] = lLineNum[i];
i++;
}else {
word[k] = rWord[j];
lineNumber[k] = rLineNum[j];
j++;
}
} else if(i<n1) {
word[k] = lWord[i];
lineNumber[k] = lLineNum[i];
i++;
} else if(j<n2){
word[k] = rWord[j];
lineNumber[k] = rLineNum[j];
j++;
}
}
}
问题出在if-else。 它们在您的代码中的结构不正确,看起来真的像这样(修复缩进之后):
if(i<n1 && j<n2) {
if(lWord[i].compareTo(rWord[j]) < 0) {
word[k] = lWord[i];
lineNumber[k] = lLineNum[i];
i++;
}else // HERE next 3 lines should be in a {} block
word[k] = rWord[j];
lineNumber[k] = rLineNum[j];
j++;
}
else if(i<n1) {
word[k] = lWord[i];
lineNumber[k] = lLineNum[i];
i++;
}else if(j<n2){
word[k] = rWord[j];
lineNumber[k] = rLineNum[j];
j++;
}
在我看来,如果不使用两个数组(int []和String []),而是使用一个同时包含word和lineNo的类的单个数组,代码将更加简洁。 就像是:
public class WordAndPosition {
public String word;
public int lineNo;
}
WordAndPosition[]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.