我修改了快速排序以使其成为多线程。 我期望它能够工作,因为原始算法正在运行。 分区后,对于枢轴左右的递归调用..我正在创建一个新线程。
public class QuickSort extends Thread{
private int[] arr;
private int left;
private int right;
public QuickSort(int[] arr){
this.arr= arr;
this.left=0;
this.right=arr.length -1;
this.start();
}
public QuickSort(int[] arr, int left , int right){
this.arr= arr;
this.left=left;
this.right=right;
this.start();
}
int partition( int left, int right)
{
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
return i;
}
void quickSort(int left, int right) {
int index = partition(left, right);
if (left < index - 1)
new QuickSort(arr, left , index -1);
if (index < right)
new QuickSort(arr ,index, right);
}
public void run(){
quickSort(left , right);
}
public static void main(String arg[])
{
int[] s = {100,99,98,97,96,95,94,93,92,91};
new QuickSort(s);
for(int i: s)
System.out.println(i);
}
}
答案 0 :(得分:1)
首先,你永远不会等待任何线程完成。所以当你打印出那个知道已完成了多少工作的数组时。
你需要以某种方式join()
你所旋转的线程(或者提出一些其他机制来弄清楚它们已经完成)。
答案 1 :(得分:1)
您的第一个问题是您没有等待任何线程退出,因此您在线程仍在运行时打印数据。您需要一些Thread.join()
来电。
我不是说没有其他问题......如果已经排序的元素,例如你的排序就会失败,例如如果你将89,90添加到测试数组中。