Java中的并行性。分而治之,快速排序

时间:2011-08-12 11:17:55

标签: java multithreading sorting quicksort divide-and-conquer

  

可能重复:
  Java: Parallelizing quick sort via multi-threading

我真的很抱歉我创造了错误的问题here, 所以我不想重复我的错误。 我发现article说明如何在分而治之算法中实现并行性。 使用Parallel.Invoke方法实现多线程。 所以问题是如何在Java中实现这种语法并优化线程与CPU协同工作

Parallel.Invoke(
        () => QuickSortInternal(array, left, last - 1),
        () => QuickSortInternal(array, last + 1, right)
    );

这里我有c#中的样本

public static void QuickSort<T>(T[] array) where T : IComparable<T>
{
    QuickSortInternal(array, 0, array.Length - 1);
}

private static void QuickSortInternal<T>(T[] array, int left, int right)
    where T : IComparable<T>
{
    if (left >= right)
    {
        return;
    }

    SwapElements(array, left, (left + right) / 2);
    int last = left;
    for (int current = left + 1; current <= right; ++current)
    {
        if (array[current].CompareTo(array[left]) < 0)
        {
            ++last;
            SwapElements(array, last, current);
        }
    }

    SwapElements(array, left, last);

    Parallel.Invoke(
    () => QuickSortInternal(array, left, last - 1),
    () => QuickSortInternal(array, last + 1, right)
);
}

static void SwapElements<T>(T[] array, int i, int j)
{
    T temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}

和Java

    static void quickSort(int numbers[], int array_size)
{
  q_sort(numbers, 0, array_size - 1);
}


static void q_sort(int numbers[], int left, int right)
{
  int pivot, l_hold, r_hold;

  l_hold = left; // левая точка left point
  r_hold = right; // правая точка right point
  pivot = numbers[left]; //средняя самая левая 
  while (left < right) // пока левая меньше правой
  {
    while ((numbers[right] >= pivot) && (left < right)) // пока правый элемент больше среднего и левый меньше правого
      right--; // правый уменьшаем
    if (left != right) // пока левый не равен правому
    {
      numbers[left] = numbers[right];// правый присвамваем левому
      left++;// левый наращиваем
    }
    while ((numbers[left] <= pivot) && (left < right))// 
      left++;
    if (left != right)
    {
      numbers[right] = numbers[left];
      right--;
    }
  }
  numbers[left] = pivot;
  pivot = left;
  left = l_hold;
  right = r_hold;
  if (left < pivot)
    q_sort(numbers, left, pivot-1);
  if (right > pivot)
    q_sort(numbers, pivot+1, right);
}

    public static void main(String[] args) {

        int m[]={4,6,2,6,34,6,32,43,2,6,76};
        for (int i = 0; i < m.length; i++) {
            System.out.print(m[i] +" ");
        }
        System.out.println("");
        quickSort(m,m.length);
        for (int i = 0; i < m.length; i++) {
            System.out.print(m[i]+" ");
        }
        System.out.println("");
    }

0 个答案:

没有答案