多线程快速排序没有按预期给出答案

时间:2012-03-08 01:54:08

标签: java multithreading quicksort

我修改了快速排序以使其成为多线程。 我期望它能够工作,因为原始算法正在运行。 分区后,对于枢轴左右的递归调用..我正在创建一个新线程。

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);





    }
}

2 个答案:

答案 0 :(得分:1)

首先,你永远不会等待任何线程完成。所以当你打印出那个知道已完成了多少工作的数组时。

你需要以某种方式join()你所旋转的线程(或者提出一些其他机制来弄清楚它们已经完成)。

答案 1 :(得分:1)

您的第一个问题是您没有等待任何线程退出,因此您在线程仍在运行时打印数据。您需要一些Thread.join()来电。

我不是说没有其他问题......如果已经排序的元素,例如你的排序就会失败,例如如果你将89,90添加到测试数组中。