2009-10-22 108 views
0

我想在Java中编写一个简单的合并排序程序,我在Eclipse中看到很多红色。我还是个初学者,不太明白什么是错的。谢谢。Java递归和合并排序

-Kyle

public class merge{ 
public static int[] mergeSub(int[] array, int left, int right){ 
     if(left<right) 
     { 
     int mid = (left+right)/2; 
     int[] a = mergeSub(array, left, mid); 
     int [] b = mergeSub(array, mid+1, right); 
     return merge(a, b); 

} 
     int[] arr=new int[1]; 
     arr[0]=arr[left]; 
     return arr; 
} 

static int[] merge(int[] left, int[] right){ 
     int index =0; int indexLeft =0; int indexRight=0; 
     int[] result = new int[left.length+right.length]; 

     while(indexLeft<left.length && indexRight<right.length){ 
       if(left[indexLeft] <= right[indexRight]) 
       { 
         result[index]=left[indexLeft]; 
         index++; 
         indexLeft++; 

       } 
       else{ 
         result[index]=right[indexRight]; 
         index++; 
         indexRight++; 
       } 
     } 

     if (indexLeft<left.length){ 
       while(indexLeft<left.length){ 
         result[index]=left[indexLeft]; 
         indexLeft++; index++; 
       } 
     } 
     if (indexRight<right.length){ 
       while(indexRight<left[indexRight]){ 
         result[index]=right[indexRight]; 
         indexRight++; right[indexRight]++; 
       } 
     } 
     return result; 
} 



public static void main(String args[]){ 

     int[] array = {2, 4, 5, 7, 5, 6, 3, 5, 7, 8}; 
     System.out.println(mergeSub(array, 0, 9)); 
}} 
+1

如果您能描述一个或两个更常见的错误,那将会更容易。 – FrustratedWithFormsDesigner 2009-10-22 03:32:41

+0

林不知道,日食似乎编译它,但仍有麻烦 – Benzle 2009-10-22 04:01:22

+1

花时间正确缩进你的代码。这将使其更具可读性和可理解性,并且会暴露各种各样的错误。 Eclipse可以帮助您使用可配置的标准自动格式化,直到找到“样式”为止。我只是拒绝去检查那些格式不一致的代码;这包括当我导师。 – 2009-10-22 04:14:19

回答

1

你应该使其在Eclipse :-)少红开始

当鼠标移动到错误,它会告诉你是什么错误。例如,在mergeSub代码中,即使leftright已被声明为int参数,您也会将leftright声明为本地阵列。以不同方式命名您的本地变量

冲洗并重复。

+0

好的,改名为左右数组a和b – Benzle 2009-10-22 03:59:48

+0

好。现在开始思考并解决其他错误。 – Bombe 2009-10-22 06:02:04

0

我的Java有点生疏,但我相信在Java中,每件事都必须在一个类中。您似乎没有在您的代码示例中声明任何类,但是为了简洁起见,您可能只是将它们排除在外?

+0

好的,叫做合并类,也是从第一个答案 – Benzle 2009-10-22 04:00:25

0

首先,您的主要功能mergeSub被声明为静态(这很好),但不能调用非静态函数。要么合并静态,要么使mergeSub成为包含类的方法。

+0

我加了一个类合并,应该这样做吗? – Benzle 2009-10-22 03:59:14

0

复制/粘贴是你的邪恶。我不想显示整个工作代码,所以:在mergeSub

arr[0]=arr[left]; should be arr[0]=array[left]; 

在合并:

while(indexRight < left[indexRight]) should be while(indexRight < right.length) 

right[indexRight]++; should be index++; 

也许还有更多。哦,你不能用println()打印数组,你必须遍历它。

+0

您也可以使用Arrays.toString(array)打印数组 – finnw 2009-10-22 04:26:43

0

我可以看到一个问题(尽管它没有解释编译时错误):

mergeSub()不检查传递一个空数组。如果你传递一个空数组,你将在arr[0]=array[left]; statemnt得到ArrayIndexOutOfBoundsException

0

你已经摆脱了红之后,根据所给出的反馈,你可以用这个one @ codecodex.com比较您的实现看看它如何叠加起来,并学习更多。