2012-03-08 2 views
0

빠른 정렬을 수정하여 다중 스레드로 만듭니다. 나는 그것이 작동하기를 기대했다. 원래 알고리즘이 작동하고 있었다. 파티셔닝 후 피벗의 왼쪽과 오른쪽으로의 재귀 호출에 대해 새 스레드를 생성 중입니다.mutithreaded 빠른 정렬이 예상대로 응답하지 않습니다.

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

"작동하지 않음"은 정확히 무엇을 의미합니까? 디버거에서 실행 했습니까? [faq] 및 [ask]를 읽고 SO에 게시하기위한 지침을 이해하십시오. 그냥 코드 묶음을 버리고 "작동하지 않습니다"라고 말하면 ... SO에서 작동하지 않습니다. –

답변

1

첫 번째 문제는 스레드가 종료 될 때까지 기다리지 않아서 스레드가 계속 실행되는 동안 데이터를 인쇄한다는 것입니다. Thread.join() 전화가 필요합니다.

다른 문제가 없다는 것은 아닙니다 ... 정렬 된 요소가 이미 있으면 정렬에 실패합니다. 테스트 배열에 89,90을 추가하면됩니다.

+0

이미 정렬 된 요소에 문제가 표시되지 않습니다. –

1

한 가지만 들어도 스레드가 끝날 때까지 기다리지 않아도됩니다. 따라서 얼마만큼의 작업이 완료되었는지 알면 배열을 인쇄 할 때가 있습니다.

당신은 어쨌든 join() 당신이 스핀 업 한 스레드를 필요로 할 것입니다 (또는 완료되었다는 것을 알 수있는 다른 메커니즘을 생각해 내십시오).

관련 문제