快速的排序问题.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
快速的排序问题

操作系统 快速排序 问题 懿 问题描述 对于有个乱序数据的数据文件执行快速排序 。 实验环境 本实验在 环境下实现 。 实验步骤 首先产生包含个随机数 (数据类型可选整型或者浮点型)的数据文件; 每次数据分割后产生两个新 的进程 (或线程)处理分割后的数据,每个进程 (线程)处理 的数据小于以后不再分割 (控制产生的进程在个左右); 线程 (或进程)之间的通信可以选择下述机制之一进行: 管道 (无名管道或命名管道) 消息队列 共享内存 通过适当的函数调用创建上述对象,通过调用适当的函数调用实现数据的读 出与写入; 需要考虑线程 (或进程)间的同步; 线程 (或进程)运行结束,通过适当的系统调用结束线程 (或进程) 解决思路 由于快速排序算法具有可分治 的特点,通过建立多线程并发进行排序可以达到加速的效 果。首先建立一个线程对原数据进行划分 ( ),得到两个区间分别建立两个线程进行 处理,直到数据数小于时不再划分,而是 自己完成排序 。这里遇到了一个问题,就是要控 制线程数在个左右。考虑到数据量较大,若按上述方法需要 同时建立远远超过个线程,只 用个线程则可能因为各线程均未到达长度小于的区间而产生死锁。故需要加入对线程的 分配机制。 操作系统 这里考虑静态建立个线程,同时建立一个队列 ,队列中的元 为待排序 区间的 首尾序号。为队列元 设置一个资源信号量,表示 队中元 个数,初始值为 。初始时将整个 数据的首尾加入 队列。每个线程执行函数从队中取出元 ,若 区间长度小于,则完成排 序 ,否则继续划分,并将得到的两个区间加入 队列,这样可以使线程数被控制在个并且不产 生死锁。 对于判断排序结束,可以设置一个共享变量记录已经排好序 的数据的数量,每 一次划分加,每次排序加 ,当增加到总数据个数时,将标志 量置为 ,即可通知各线程终止 。 每个线程执行的程序 的伪代码如下: CODE 1: Function for each thread void Parallel_Quicksort(char* shrmem) { // shrmem is the name of shared memory HANDLE hMapSrc; hMapSrc = OpenFileMapping(shrmem); // get the starting address of the mapped view. int *pBuf = (int *)MapViewOfFile(hMapSrc, BUF_SIZE); /* Waiting to get sorting job from the unsorted queue while sort not finished*/ while (!End P(N_unsorted)) { P(queue); // fetch job from unsorted Param param0 = unsorted.front()

文档评论(0)

liwenhua00 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档