下面是基于 OpenMP 的快速排序算法代码:

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

// 串行快速排序函数
void quickSort(int arr[], int left, int right) {
    int i = left, j = right;
    int pivot = arr[(left + right) / 2];
  
    // 分割
    while (i <= j) {
        while (arr[i] < pivot)
            i++;
        while (arr[j] > pivot)
            j--;
        if (i <= j) {
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
            i++;
            j--;
        }
    }
  
    // 递归排序左半部分和右半部分
    if (left < j)
        quickSort(arr, left, j);
    if (i < right)
        quickSort(arr, i, right);
}

// 并行快速排序函数
void parallelQuickSort(int arr[], int left, int right) {
    if (left < right) {
        int i = left, j = right;
        int pivot = arr[(left + right) / 2];
      
        // 分割
        while (i <= j) {
            while (arr[i] < pivot)
                i++;
            while (arr[j] > pivot)
                j--;
            if (i <= j) {
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
                i++;
                j--;
            }
        }
      
        // 递归排序左半部分和右半部分
        #pragma omp parallel sections
        {
            #pragma omp section
            {
                parallelQuickSort(arr, left, j);
            }
            #pragma omp section
            {
                parallelQuickSort(arr, i, right);
            }
        }
    }
}

int main() {
    int arr[] = {5, 2, 8, 9, 1, 3, 7, 4, 6};
    int n = sizeof(arr) / sizeof(arr[0]);
    
    // 设置线程数
    int numThreads = 4;
    omp_set_num_threads(numThreads);
    
    // 并行快速排序
    parallelQuickSort(arr, 0, n - 1);
    
    // 输出排序结果
    printf("Sorted array: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    
    return 0;
}

在上述代码中,我们使用了 #pragma omp parallel sections 来并行执行两个递归排序任务,每个任务在一个不同的线程中执行。同时,我们使用 omp_set_num_threads 函数设置线程数为 numThreads。最后,我们使用 #pragma omp parallel for 来并行执行循环中的工作量,实现两两合并

基于 OpenMP 的快速排序算法代码1调用 omp_set_num_threads 函数设置线程数numThreads利用 parallel 指令将代码复制到 no 个线程上执行。2将排序任务划分到不同的线程中去每个子线程调用 omp_get_num_threads 函数获取当前线程号。主线程调用 omp_get_num_threads 函数获取当前并行的线程个数各线程计算对应序列的起始结束下标

原文地址: http://www.cveoy.top/t/topic/ib3V 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录