我真的很抱歉我创造了错误的问题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("");
}