该函数对位于区间[s,e](v [s],v [s + 1],...,v [e]将被排序)的数组v的元素进行排序。
对于数组3 2
,它会2 3
但对于具有2个以上元素的数组(如3 2 4
),它会使数组不变。
void merge(int v[],int s, int e)
{
if(e==s) return; //if there is just one number
int m=(s+e)/2;
pid_t f1,f2;
if((f1=fork())==0){merge(v,s,m);exit(0);} //sort the numbers from position s to position m
if((f2=fork())==0){merge(v,m+1,e);exit(0);} //same for numbers from position m+1 to e
waitpid(f1,NULL,0); //wait until the first half is sorted
waitpid(f2,NULL,0); //same for the second half
int *t=(int*)malloc((e-s+1)*sizeof(int)); //temporary array for merging the 2 halves
int k=0,i=s,j=m+1;
while((i<=m)&&(j<=e)) //while there are stil unprocessed numbers left in each half
if(v[i]<v[j]) t[k++]=v[i++];
else t[k++]=v[j++];
while(i<=m) t[k++]=v[i++]; //copy the remaining numbers
while(j<=e) t[k++]=v[j++];
while(k) v[e--]=t[--k]; //copy them back in the original array
free(t); //delete the temporary array
}
答案 0 :(得分:1)
在您分叉后,您的两个进程没有共享相同的数据,它们从相同的副本开始,但是它们自己进行了更改,父进程没有看到它们的更改
如果你想要平行,你必须
答案 1 :(得分:0)
如果您没有专门附加到合并排序,那么这里是forking quick sort,它总是在第一个元素上转动。此外,它使用popen / pclose而不是显式的fork / waitpid。