Проблема в быстрой сортировке с использованием openMP.Я продолжаю получать ошибку - PullRequest
0 голосов
/ 20 ноября 2018

Мне хорошо известно, что этот код странный.Немного C и в основном C ++.Я новичок в C, и я не мог понять, как делать определенные вещи в C, поэтому я сделал странный образ.

Я хочу быстро отсортировать каждую строку параллельно.Я пытаюсь передать строку в функцию, но получаю ошибку.Я создал динамический массив, чтобы для каждой строки у меня был новый поток для быстрой его сортировки - number of rows = number of threads.Каждый поток должен отсортировать строку.Вы, наверное, видели эту реализацию быстрой сортировки в другом посте на этом сайте.Мне просто нужно несколько рекомендаций, если я все делаю правильно.

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <time.h>
using namespace std;

int ParPartition(int *a, int p, int r);
void ParQuickSort(int *a, int p, int r);

int main()
{
    int r = 0;
    int c = 0;
    int count = 0;
    int rtemp = 0;
    int cTemp = 0;

    printf("Enter row and column respectively : ");
    scanf_s("%d %d", &r, &c);

    int** arr = new int*[r];
    for (int i = 0; i < r; ++i)
        arr[i] = new int[c];

    srand(time(NULL));
    for (int row = 0; row < r; row++)
    {
        for (int col = 0; col < c; col++)
        {
            arr[row][col] = rand();
            count += arr[row][col];
        }
    }

    cout << endl << r * c << " random numbers" << endl;
    for (int row = 0; row < r; row++)
    {
        for (int col = 0; col < c; col++)
        {
            cout << arr[row][col] << "\t";
        }
        cout << endl;
    }
        cout << endl << "Total : " << count << endl;

    ParQuickSort(arr[0][r], 0, c - 1);

    for (int i = 0; i < c; i++)
    {

    }

    for (int i = 0; i < r; i++)
    {
        delete[] arr[i];
    }
    delete[] arr;

    system("pause");
}

int ParPartition(int *a, int p, int r)
{
    int *b = new int[r - p];
    int key = *(a + r); // use the last element in the array as the pivot
    int *lt = new int[r - p]; // mark 1 at the position where its element is smaller than the key, else 0
    int *gt = new int[r - p]; // mark 1 at the position where its element is bigger than the key, else 0
    int cnt_lt = 0; // count 1 in the lt array
    int cnt_gt = 0; // count 1 in the gt array
    int j = p;
    int k = 0; // the position of the pivot
               // deal with gt and lt array
#pragma omp parallel for
for (j = p; j<r; ++j) {
    b[j - p] = *(a + j);
    if (*(a + j) < key) {
        lt[j - p] = 1;
        gt[j - p] = 0;
    }
    else {
        lt[j - p] = 0;
        gt[j - p] = 1;
    }
}
// calculate the new position of the elements
for (j = 0; j<(r - p); ++j) {
    if (lt[j]) {
        ++cnt_lt;
        lt[j] = cnt_lt;
    }
    else
        lt[j] = cnt_lt;
    if (gt[j]) {
        ++cnt_gt;
        gt[j] = cnt_gt;
    }
    else
        gt[j] = cnt_gt;
}
// move the pivot
k = lt[r - p - 1];
*(a + p + k) = key;
// move elements to their new positon
#pragma omp parallel for 
for (j = p; j<r; ++j) {
    if (b[j - p] < key)
        *(a + p + lt[j - p] - 1) = b[j - p];
    else if (b[j - p] > key)
        *(a + k + gt[j - p]) = b[j - p];
}
return (k + p);
}

void ParQuickSort(int *a, int p, int r)
{
    int q;
    if (p<r) 
    {
        q = ParPartition(a, p, r);
#pragma omp parallel sections
        {
#pragma omp section
        ParQuickSort(a, p, q - 1);
#pragma omp section
        ParQuickSort(a, q + 1, r);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...