草庐IT

C++并行排序

全部标签

常用的排序算法

1.冒泡排序按照冒泡排序的思想,把相邻的元素两两比较,当一个元素大于右侧相邻元素时候,交互他们位置当一个元素小于或者等于右侧相邻元素时候,位置不变。相应代码实现: voidsort(intarray[]){for(inti=0;iarray[j+1]){temp=array[j];array[j]=array[j+1];array[j+1]=temp;}}}}这是典型的冒泡写法,使用双循环进行排序。外层循环控制所有的回合,内部循环实现每一轮的冒泡处理,先比较在决定是否交换。 举例说明:intarray[]={3,4,2,1,5,7,6}; 那么外层循环第一轮比较图示:   那么可以得到外层循环

c++ - 为什么按降序排序与升序排序时快速排序需要更长的时间

我有快速排序和归并排序的代码,并且我放置了一个全局计数器变量,每次迭代(比较)时它都会递增。我假设这符合我粗略的渐近分析。对于合并排序,它确实如此,但对于快速排序,它却没有。我不明白为什么。我选择输入数组的最后一个元素是每次迭代的基准。我知道这不是最优的,但为了本次讨论,这无关紧要。因为我选择了最后一个元素,所以我希望升序和降序数组都会导致O(n^2)比较。更具体地说,我希望比较的次数是n选择2,因为在最坏的情况下你要添加n+n-1+n-2+n-3+....+1。但这似乎并没有发生。在输入大小为100,000的情况下,输入按降序排序,我得到705,082,704次迭代计数。对于按升序排

c++ - 是否有与 Thrust(GPU 的并行 STL)类似的库,但用于 GPGPU AMD Radeon?

关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有类似Thrust的库(用于GPU的并行STL,可以使用OpenMP/TBB,C++CUDA),但用于GPGPUAMDRadeon(例如使用OpenCL而不是使用CUDA)?所需的标准STL算法(排序、合并、删除/复制、In/Exc

c++ - std::vector push_back 在并行 for 循环中使用时失败

我有一个代码如下(简化代码):for(inti=0;i此代码运行良好,但如果我想使用ompparallelfor使其并行,我会在output.push_back上收到错误,并且似乎在调整vector大小期间,内存已损坏。问题是什么,我该如何解决?如何确保在任何时候只有一个线程将新项目插入vector? 最佳答案 简单的答案是std::vector::push_back不是线程安全的。为了安全地并行执行此操作,您需要同步以确保不会同时从多个线程调用push_back。C++11中的同步可以通过使用std::mutex轻松实现。

c++ - 使用并行数组的初学者编程学生

对所有程序员都非常尊重的初学者程序员。我的头发不见了,有时我因为试图解决这些问题而感到筋疲力尽。Anyhoot当前任务让我从我已经完成的.txt文件中读取数据。执行计算并输出到屏幕。读入的数据比我应该写入输出文件的变量更多。所以我已经读入了数据,现在我必须将tripNumber和FinalCost读入两个不同的数组,然后将Reverse中的数据写入文件。我已经掌握了其中的大部分内容,但仍停留在一些应该在我的代码中清楚的地方。意识到每个人都有自己的问题,这不是一个悲伤的故事。我每周工作60多个小时,正在努力获得学位。感谢您提供任何帮助或建议,使这项复杂的技能更容易理解。#include#

c++ - 嵌套并行级别的 omp critical 行为

考虑以下场景:函数A创建一层OMP并行区域,每个OMP线程调用函数B,函数B本身包含另一层OMP并行区域。然后,如果在函数B的并行区域内,存在一个OMP临界区域,那么,该区域对于函数A和B创建的所有线程来说是“全局”临界的,还是仅对函数B是局部的?如果B是预构建函数(例如静态或动态链接库)怎么办? 最佳答案 OpenMP中的关键区域具有全局绑定(bind),它们的范围扩展到所有出现的具有相同名称的关键构造(在这方面,所有未命名的构造共享相同的特殊内部名称),无论它们出现在代码中的何处。您可以在OpenMPspecification的

c++ - 使用 std::sort 对二维数组进行排序(基于列)

我正在运行一个测试,显示按列对二维数组进行排序的好处,方法是将数据提取到一个单独的数组中并对该数组进行排序,然后将其复制回该列。我想运行std::sort作为每次运行的排序算法。我试图弄清楚如何先在适当的位置运行循环,然后再进入二维阵列的复制和复制。输入/输出的一个例子是这样的。#include#includeintmain(){intinput[][5]={{13,27,4,1,11},{11,19,2,37,1},{32,64,11,22,41},{71,13,27,-8,-2},{0,-9,11,99,13}};//std::sortsomethinghere.intoutput

c++ - 如何在不知道宽度或高度的情况下最好地对矩形的角进行排序?

我有一个检测到的矩形的四个坐标。我想找出其中哪些是左上角、右上角、左下角和右下角点。我自己写的方法(不必要地)很长并且没有真正起作用(可能是因为我在某处犯了错误)。无论哪种方式,我确信有一种更简单的方法,但我找不到使用谷歌的方法。因此,我们将不胜感激。我的方法是找到最大y(最上)、最小y(最下)、最大x(最右)、最小x(最左)的角。然后如果most-left.y>themost-right.y则左上点是most-left,右上点是most-top等。这种方法是否正确?还有更简单的方法吗?我的代码,抱歉,它凌乱而困惑......squareX[0]是第一个x坐标squareY[0]是第一

排序算法进阶——归并排序【详细图解,递归和非递归】

文章目录归并算法基本思想:具体代码实现:归并排序基本思想方法一:递归实现方法:完整代码:方法二:利用下标变化直接在数组中归并【非递归】实现方法:完整代码:归并排序的时间复杂度归并排序的空间复杂度归并排序的稳定性归并算法在了解归并排序之前让我们先了解一下归并这一算法吧!归并算法一般应用于合并两个已经有序的序列,使合并后的序列也有序,是一个时间复杂度为O(N)的算法,不过一般要借助两个要排序的序列的元素个数个额外的空间。一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一基本思想:既然要排序的两个序列已经有序,那么就可以先申请两个序列元素之和大小的空间,再比较两个序列的

c++ - 排序前修改顺序一致性

来自http://en.cppreference.com:宽松排序标记为std::memory_order_relaxed的原子操作不是同步操作,它们不排序内存。它们只保证原子性和修改顺序的一致性。例如,x和y最初为零,//Thread1:r1=y.load(memory_order_relaxed);//Ax.store(r1,memory_order_relaxed);//B//Thread2:r2=x.load(memory_order_relaxed);//Cy.store(42,memory_order_relaxed);//D被允许产生r1==r2==42因为,虽然A排在B