2010-11-09 5 views
1

J'essaie de trier un nombre d'entiers en utilisant 4 threads, en séparant le tableau puis en le recombinant. Je pense que j'ai accompli en utilisant 2 threads, quelqu'un peut-il aider d'ici comment je passerais à l'utilisation de 4?Tri avec plusieurs threads

import java.util.Random; 
import java.util.Arrays; 

public class threadSort implements Runnable { 
private static final int L = 64; 
private static int[] nums; 
private static Random rand; 

public void run() { 
    //sorting upper half 
    Arrays.sort(nums, nums.length/2, nums.length); 
} 

public static void main(String args[]) throws InterruptedException { 

    nums = new int[L]; 
    rand = new Random(); 

    //fill the array 
    for(int i=0; i<nums.length; i++) { 
     nums[i] = rand.nextInt(10); 
    } 

    Thread t = new Thread(new threadSort()); 
    t.start(); 

    //sorting lower half 
    Arrays.sort(nums, 0, nums.length/2); 

    t.join(); 

    /* merge */ 
    int j = 0; 
    int k = nums.length/2; 
    int[] tmp = new int[nums.length]; 
    for (int i=0; i<tmp.length; i++){ 
     if (j < nums.length/2) { 
      if (k < nums.length) { 
       if (nums[j] < nums[k]) { 
        tmp[i] = nums[j++]; 
       } else { 
        tmp[i] = nums[k++]; 
       } 
      } else { 
       /* reached end of second half, copy first*/ 
       tmp[i] = nums[j++]; 
      } 
     } else { 
      /* reached end of 1st half, copy 2nd*/ 
      tmp[i] = nums[k++]; 
     } 
    } 
    nums = tmp; 


    //Testing Sort and Total 
    int count = 0; 

    for(int i=0; i<nums.length; i++){ 
    System.out.print(nums[i] + " "); 
    count++; 
    } 
    System.out.println(); 
    System.out.println("Total amount of Integers = " + count); 
} 

} 

thats ce que j'ai jusqu'à présent Je veux rester avec ce que j'ai, mais jeter 2 autres fils dans

+0

Je recommanderais une approche récursive pour permettre des tableaux de taille indéfinie. –

+0

Eh bien, je voulais vraiment juste pour un tableau 64 ints. – Shonna

+1

J'espère que c'est pour les devoirs ou l'éducation personnelle. Le tri de 64 éléments est typiquement (en fonction de l'implémentation du Comparateur) une opération si triviale que la surcharge dans la création de Threads et la synchronisation du modèle de mémoire devraient dépasser de loin tout gain de performance. –

Répondre

1

La meilleure façon est d'utiliser forkjoin. Fondamentalement, vous divisez récursivement vos données en morceaux binaires jusqu'à ce que vous ayez un morceau assez petit avec lequel vous voulez travailler. L'utilisation du framework forkjoin de DL est un exercice amusant, mais si vous voulez rester simple, poursuivez votre lecture.

Tout ce que vous avez à faire est d'appeler votre algorithme actuel deux fois. Autrement dit, utilisez-le pour casser vos données de moitié. Ensuite, appelez votre algorithme sur chaque moitié. Lorsque les deux sont faites, fusionner leurs résultats.

+0

+1, mais ... Est-ce que Doug Lea passe par DL maintenant? Général FYI, 'ForkJoin' est une partie du paquet concurrentiel de Java 7 (d'après ce que j'ai vu). –

+0

DL était mon professeur à l'université. Et oui, il est prévu d'être en Java 7. Voir: http://cs.oswego.edu/pipermail/concurrency-interest/2010-September/007435.html – Jeremy