程序通过生成随机数组,利用OpenMP实现并行化的枚举排序算法,并与串行算法进行了比较。
#include <omp.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#define maxn 100000
#define NUM_THREADS 20
int n;
int a[maxn], ans[maxn]; // a 原数组,ans 排序后数组
void array_init()
{
srand(time(NULL));
int i;
for (i = 0; i < n; i++)
{
a[i] = rand() % 1000 + 1;
}
}
void parallel()
{
int i, j, k;
omp_set_num_threads(NUM_THREADS);
double start_time = omp_get_wtime();
#pragma omp parallel private(i, j, k)
{
#pragma omp for
for (i = 0; i < n; i++)
{
k = 0;
for (j = 0; j < n; j++)
{
if (a[i] > a[j])
{
k++; //记录比自己小的数的个数
}
}
ans[k] = a[i];
}
}
double end_time = omp_get_wtime();
double time_used = end_time - start_time;
printf("并行耗时:%f s\n", time_used);
// 输出排序后数组
// for (i = 0; i < n; i ++) printf("%d ", ans[i]);
}
void single()
{
int i, j, k;
double start_time = omp_get_wtime();
for (i = 0; i < n; i++)
{
k = 0;
for (j = 0; j < n; j++)
{
if (a[i] > a[j])
{
k++;
}
}
ans[k] = a[i];
}
double end_time = omp_get_wtime();
double time_used = end_time - start_time;
printf("串行耗时:%f s\n", time_used);
// 输出排序后数组
// for (i = 0; i < n; i ++) printf("%d ", ans[i]);
}
int main()
{
puts("输入待排序数据规模, 输入0结束");
while (scanf("%d", &n), n)
{
if (n >= maxn)
{
puts("输入数据规模过大,重新输入");
continue;
}
array_init();
parallel();
single();
puts("\n输入待排序数据规模, 输入0结束");
}
return 0;
}