【发布时间】:2015-04-13 18:58:09
【问题描述】:
我想使用线程二叉树对 Java 中的 ArrayList 进行排序。 问题如下:
main 方法通过随机生成的列表创建第一个节点。每个节点的行为方式都相同。如果列表有 0 或 1 个元素,则返回。否则,它会创建两个新节点,将列表的两半传递给它们。一旦子节点对它们的列表进行了排序,父节点就会合并它们以保持它们的排序。
这是我迄今为止编写的代码...
但我无法让它工作!它最终会继续打印未排序的列表。
并提前非常感谢您。
Main.java
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rnd = new Random();
List<Integer> list = new ArrayList<Integer>();
int size = rnd.nextInt(90) + 1 + 10;
for (int i = 0; i < size; i++) {
list.add(rnd.nextInt(100));
}
Node n = new Node(list);
n.start();
try {
n.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("The sorted list:\n" + list.toString());
}
}
Node.java
import java.util.ArrayList;
import java.util.List;
public class Node extends Thread {
private List<Integer> list;
public Node(List<Integer> list) {
this.list = list;
}
public void run() {
if (list.size() <= 1)
return;
List<Integer> l1, l2;
l1 = new ArrayList<Integer>();
l2 = new ArrayList<Integer>();
add(l1, 0, list.size() / 2);
add(l2, list.size() / 2, list.size());
Node a, b;
a = new Node(l1);
b = new Node(l2);
a.start();
b.start();
try {
a.join();
b.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
merge(l1, l2);
}
private void add(List<Integer> l, int from, int to) {
l.addAll(list.subList(from, to));
}
private void merge(List<Integer> l1, List<Integer> l2) {
list = new ArrayList<Integer>();
int size1 = l1.size();
int size2 = l2.size();
int i1 = 0, i2 = 0, n1, n2;
while (i1 < size1 && i2 < size2) {
n1 = l1.get(i1);
n2 = l2.get(i2);
if (n1 <= n2) {
list.add(n1);
i1++;
} else {
list.add(n2);
i2++;
}
}
while (i1 < size1) {
list.add(l1.get(i1++));
}
while (i2 < size2) {
list.add(l2.get(i2++));
}
}
}
【问题讨论】:
标签: java multithreading sorting arraylist binary-tree