#include
#include
#include
#include
int numThread=2;
void quicksort(int *A, int l, int u)
{
if(l >= u)
{
return;
}
int first = l;
int last = u;
int key = A[first]; //用字表的第一个记录作为枢轴
while(first < last)
{
while(first < last && A[last] >= key)
{
--last;
}
A[first] = A[last]; //将比第一个小的移到低端
while(first < last && A[first] <= key)
{
++first;
}
A[last] = A[first];
//将比第一个大的移到高端
}
A[first] = key; //枢轴记录到位
quicksort(A,l,first-1);
quicksort(A,first+1,u);
}
void main(int argc, char *argv)
{
omp_set_num_threads(numThread);
int j=50000,k=0,i=0;
int m=0,n=0;
double start,end,difftime1,difftime2;
int len=50000;
int len2=len/2;
int B[50000],C[25000],D[25000];
#pragma omp parallel default(none) shared(B,len) private(i)
{
#pragma omp for
for(i=0;i<len;i++)
{
B[i]=1+rand()%50000; //初始化B数组
}
}
//串行程序
start=clock(); //开始计时
quicksort(B,0,len-1);
end=clock(); //结束计时
difftime1=(end-start)/1000;
printf("%lf seconds\n",difftime1); //输出运行时间
//多线程程序
start=clock(); //开始计时
#pragma omp parallel default(none) shared(B,C,D,len2) private(i)
{
#pragma omp for
for(i=0;i<len2;i++) //这个for循环是并行的
{
C[i]=B[i]; //将B的前25000个数放入C
D[i]=B[i+25000]; //将B的后25000个数放入D
}
}
#pragma omp parallel default(none) shared(C,D,len2) //private(i)快速排序的并行
{
#pragma omp parallel sections
{
#pragma omp section
quicksort(C,0,len2-1); //对C排序
#pragma omp section
quicksort(D,0,len2-1); //对D排序
}
}
for(;k<len;k++) //将C和D进行归并排序放入B里面
{
if(m<len2&&n<len2)
{
if(C[n]<=D[m])
{
B[k]=C[n];
n++;
}
else
{
B[k]=D[m];
m++;
}
}
if(m==len2||n==len2)
{
if(m==len2)
B[k]=D[m];
else
B[k]=C[n-1];
k+=1;
break;
}
}
if(n<len2)
{
int tem=len2-n;
for(int p=0;p<tem;p++)
{
B[k]=C[n];
n++;
k++;
}
}
else if(m<len2)
{
int tem=len2-m;
for(int q=0;q<tem;q++)
{
B[k]=D[m];
m++;
k++;
}
}
end=clock(); //结束计时
difftime2=(end-start)/ 1000;
printf("%lf seconds\n",difftime2); //输出运行时间
printf("speed ratio=%.3f\n",difftime1/difftime2); //加速比
system("pause");
}
总是运行不出来结果