2010-11-09 19 views
1

Я пытаюсь сортировать несколько целых чисел, используя 4 потока, разбивая массив и затем рекомбинируя. Я думаю, что я выполнил использование 2 потоков, может ли кто-нибудь помочь отсюда, как я перейду к использованию 4?Сортировка с несколькими потоками

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

} 

вот что я до сих пор я хочу, чтобы придерживаться того, что я имею, но бросить еще 2 темы в

+0

Я бы рекомендовал рекурсивный подход, чтобы позволить массивы неопределенного размера. –

+0

ну, я действительно просто хотел его для массива 64 ints. – Shonna

+1

Надеюсь, это для домашней работы или личного образования. Сортировка 64 элементов обычно (в зависимости от реализации компаратора) такая простая операция, что накладные расходы при создании потоков и синхронизация модели памяти должны намного превышать любое увеличение производительности. –

ответ

1

Лучший способ заключается в использовании forkjoin. В основном вы рекурсивно делите ваши данные на двоичные куски, пока у вас не будет достаточно небольшой кусок, с которым вы хотите работать. Использование инфраструктуры forkjoin DL - забавное упражнение, но если вы хотите сохранить его простым, читайте дальше.

Все, что вам нужно сделать, это дважды вызвать ваш текущий алгоритм. То есть, используйте его, чтобы разбить ваши данные пополам. Затем вызовите свой алгоритм на каждую половину. Когда оба они сделаны, объедините их результаты.

+0

+1, но ... Дуг Ли сейчас идет DL? General FYI, 'ForkJoin' является частью пакета параллелизма Java 7 (из того, что я видел). –

+0

DL был моим профессором в колледже. И да, он ориентирован на Java 7. См .: http://cs.oswego.edu/pipermail/concurrency-interest/2010-September/007435.html – Jeremy