2014-02-14 36 views
0

我是一名AP计算机科学专业的学生,​​我目前的任务是必须制作一个程序,该程序需要一个数字ArrayList,并且只使用标准Java API,使用合并分类。没有任何编译错误,但在运行时它甚至不返回ArrayList!经过一些调试,我发现它没有填充原始列表。请帮忙!代码:Java算法 - 使用ArrayList进行合并排序

import java.io.*; 
import java.util.*; 

public class MergeSort { 
    public static void main(String[] args) throws IOException{ 
    Scanner in = new Scanner(System.in); 
    Random r = new Random(); 
    int size, largestInt, holder; 

    System.out.println("How many integers would you like me to create?"); 
    size = in.nextInt(); 
    ArrayList<Integer>list = new ArrayList<Integer>(size); 
    System.out.println("What would the largest integer be?"); 
    largestInt = in.nextInt(); 

    for(int i = 0; i < list.size(); i++){ 
     holder = r.nextInt(largestInt + 1); 
     list.add(holder); 
    } 
    mergeSort(list); 

    for (int j = 0; j < list.size(); j++) { 
     if(j == 19 || j == 39 || j == 59 || j == 79 || j == 99 || j == 119 || j == 139 || j == 159 || j == 179 || j == 199){ 
      System.out.print(list.get(j)); 
      System.out.println(); 
     } 
     else{ 
      System.out.println(list.get(j) + "\t"); 
     } 
    } 

} 

static void mergeSort(ArrayList<Integer> list) { 
    if (list.size() > 1) { 
     int q = list.size()/2; 
     ArrayList<Integer> leftList = new ArrayList<Integer>(); 
     for(int i = 0; i > 0 && i <= q; i++){ 
      leftList.add(list.get(i)); 
     } 
     ArrayList<Integer> rightList = new ArrayList<Integer>(); 
     for(int j = 0; j > q && j < list.size(); j++){ 
      rightList.add(list.get(j)); 
     } 

     mergeSort(leftList); 
     mergeSort(rightList); 
     merge(list,leftList,rightList); 
    } 
} 

static void merge(ArrayList<Integer> a, ArrayList<Integer> l, ArrayList<Integer> r) { 
    int totElem = l.size() + r.size(); 
    int i,li,ri; 
    i = li = ri = 0; 
    while (i < totElem) { 
     if ((li < l.size()) && (ri<r.size())) { 
      if (l.get(li) < r.get(ri)) { 
       a.set(i, l.get(li)); 
       i++; 
       li++; 
      } 
      else { 
       a.set(i, r.get(ri)); 
       i++; 
       ri++; 
      } 
     } 
     else { 
      if (li >= l.size()) { 
       while (ri < r.size()) { 
        a.set(i, r.get(ri)); 
        i++; 
        ri++; 
       } 
      } 
      if (ri >= r.size()) { 
       while (li < l.size()) { 
        a.set(i, l.get(li)); 
        li++; 
        i++; 
       } 
      } 
     } 
    } 
} 
+0

不必要的循环会损害性能。尝试使用ArrayList.subList(int fromIndex,int toIndex),在ArrayList的情况下应该更快。 –

+0

啊,是的。我忘了ArrayList继承了这个。我一定会改变这一点。谢谢。 –

回答

1

这是因为list.size()为空列表返回0。在填充列表的循环中,将list.size()替换为size

我还没有检查过程中的实际mergeSort部分,但我建议的更改至少会使列表的初始人群工作。

+0

真棒打印!但是现在它不允许正确的输出。我试图格式化它从左到右的位置,并使用“\ t”隔开并转到下一行。我可能会改变这个 “如果(j%20 == 0){” 只是使它的每增加20(即20,40,60,80等最多200)。 –

+0

我建议'java.util.Arrays.toString(T []数组)'从'youList.toArray(〜)'打印数组...'并且看看'Arrays.sort(〜)'它。由于您的分配仅限于Java标准API –

+0

现在确定排序算法需要工作。它似乎没有正确计算......:我 –