2016-08-31 2 views
1

Итак, я разрабатываю код в java для деления массива размера 20 на 4 части, где эти 4 потока будут выполняться вместе для кучи элементов сортировки 5 (Thread 1 sorts index 0-4, Thread 2 sorts индекс 5-9 и т. д.) и, наконец, слияние их с методом сортировки слияния. Сортировка слияний прекрасно работает, поэтому я не включаю ее. Но функция сортировки кучи не дает правильного ответа. Нити продолжают вращаться в индексе от 14 до 19 из массива. Есть ли что-то, что я делаю неправильно здесь?Сортировка кучи с помощью Threading

class heapsort 
{ 
    private static int[] a; 
    private static int i; 
    private static int left; 
    private static int right; 
    private static int largest; 

    public static void maxheap(int[] a, int i,int n00,int n01) 
    { 
    left = 2 * i; 
     right = 2 * i + 1; 
     if ((left >= n00 && left <=n01) && a[left] > a[i]) 
     { 
      largest = left; 
     } 
    else 
    { 
      largest = i; 
     } 
     if ((right >= n00 && right <=n01) && a[right] > a[largest]) 
    { 
      largest = right; 
     } 
     if (largest != i) 
    { 
      int t = a[i]; 
      a[i] = a[largest]; 
      a[largest] = t; 
     heapsort h1=new heapsort(); 
      h1.maxheap(a, largest,n00,n01); 
     } 
    } 

} 

class sorter_ss extends Thread 
{ 

    private static int n1,n2,n; 
    private static int a[]; 
    sorter_ss(int a0[],int i1, int i2) 
    { 
     a=a0; n1=i1; n2=i2; 
    } 
    public void run() 
    { 
    //build heap function 
    int n3=(n2+n1)/2; 
     for (int i = n3; i >= n1; i--) 
    { 
     heapsort h1=new heapsort(); 
      h1.maxheap(a,i,n1,n2); 
     } 
//heapsort function 
     for (int i = n2-1; i >= n1; i--) 
    { 
      int t = a[i]; 
      a[i] = a[n1]; 
      a[n1] = t; 
     heapsort h2=new heapsort(); 
      h2.maxheap(a,i,n1,n2); 
     } 
    } 

} 


public class testheap 
{ 
    public static void main(String[] args) 
    { 

     int[] a2 = { 4, 1, 3, 2, 16, 9, 10, 14, 8, 7, 80, 76, 34, 23, 56, 90, 99, 321, 86, 75}; 
     caller(a2); 

    } 
    public static void caller(int a1[]) 
    { int t[]=new int[100]; 
    System.out.println("Array is : \n"); 
    for (int i = 0; i < a1.length; i++) 
    { 
      System.out.print(a1[i] + " "); 
     } System.out.println(); 

    try{ 
    sorter_ss s1=new sorter_ss(a1,0,4); 
    sorter_ss s2=new sorter_ss(a1,5,9); 
    sorter_ss s3=new sorter_ss(a1,10,14); 
    sorter_ss s4=new sorter_ss(a1,15,19); 
    s1.start(); 
    s2.start(); 
    s3.start(); 
    s4.start(); 
    s1.join(); 
    s2.join(); 
    s3.join(); 
    s4.join(); 
    } 
    catch(InterruptedException e) 
      { 
         e.printStackTrace(); 
       } 
    System.out.println("Sorted Array is : \n"); 
    for (int i = 0; i < a1.length; i++) 
    { 
      System.out.print(a1[i] + " "); 
     } System.out.println(); 
    } 
} 

ответ

0

Ваша самая основная проблема заключается в том, что вы используете static объявить поля вашего потока. Вы никогда не должны этого делать.

sorter_ss s1=new sorter_ss(a1,0,4); 
sorter_ss s2=new sorter_ss(a1,5,9); 
sorter_ss s3=new sorter_ss(a1,10,14); 
sorter_ss s4=new sorter_ss(a1,15,19); 

В основном ваши 4 потока будут работать только между 15-19 индексами, потому что вы установите их последним.

Когда вы исправить это, пожалуйста, обратите внимание на вилке/Join, он был создан специально для что:

http://www.oracle.com/technetwork/articles/java/fork-join-422606.html

Смежные вопросы