免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2199 | 回复: 5
打印 上一主题 下一主题

[C] 请教 如何用线程实现 qsort的递归部分??多谢。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-18 16:54 |只看该作者 |倒序浏览
线程编程刚学。。。所以很多函数的使用不太理解。。。
另外,排序每次的 left,right都要进行修改,使用全局变量不能控制么。。。求助!!!

论坛徽章:
0
2 [报告]
发表于 2009-05-18 16:58 |只看该作者
递归调用如果用全局改变left和right的话应该是可以的,但是需要自己操作,可能比较麻烦,因为排序的个数不一定是2的幂,那样划分中就有某一级总数是奇数的情况,划分容易,但是回去的话就可能有丢失元素的情况了

论坛徽章:
0
3 [报告]
发表于 2009-05-19 10:41 |只看该作者
嗯。。。反正我认为是有点 麻烦的。。 left和right变化 如果用用全局变量的话。。。

第一次全部排完后,分成两边。。分别进行时,left 和right的记录就有问题了。。。

另外结束 这个排序的循环条件 是什么呢??费解。。。

论坛徽章:
0
4 [报告]
发表于 2009-05-19 10:46 |只看该作者

回复 #3 wenqing_9115 的帖子

恩,观点类似的,往下层容易进行,但是往上层回复的时候就有问题了,至于结束好弄,因为每次回复基本上是长度乘以2,所以如果你推到长度比原长度大就可以退出了。
个人观点

论坛徽章:
0
5 [报告]
发表于 2009-05-20 14:15 |只看该作者
能够在线程内部 再创建自己的线程么??
就像递归一样。。。。

3个元素以下的情况不创建线程。。。。

论坛徽章:
0
6 [报告]
发表于 2009-05-20 14:21 |只看该作者
switch(n){
              case 1:return;
              case 2:swap(a[x],a[j]); x is i;
                     break;
              case 3:
                    for(;j<n;j++)
                        {
                    for(;i<n-j;i++)
                        {
                        if(a>a[i+1])
                        {
                        w=a;
                        a=a[j];
                        a[j]=w;
                        }
                      }
                     }
                     break;
              default:
              while(1){
                while(a<p)
                        i++;
                while(p<a[j])
                        j--;
                if(i>=j) break;
                if(i<j){
                        w=a;
                        a=a[j];
                        a[j]=w;
                }
               i++;
               j--;
                }
              }
              mutex_lock(&lock);
              if(l<i-1)
                {
                r=i-1;
                n=j-i+1;
                printf("n is:%d\n",n);
                p=a[l];
                thr_create(NULL,NULL,qsort,NULL,NULL,&thr_id[id++]);
              }
              mutex_unlock(&lock);
          //  if(n==1) return;


           l=l_temp;
           r=r_temp;
           mutex_lock(&lock);
            if(j+1<r)
           {
                l=j+1;
                p=a[l];
                printf("n is:%d\n",n);
                n=j-i+1;
                thr_create(NULL,NULL,qsort,NULL,NULL,&thr_id[id++]);
               }
           mutex_unlock(&lock);

thr_exit(NULL);
}

[ 本帖最后由 wenqing_9115 于 2009-5-20 14:25 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP