Sorting(排序)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhougb3/article/details/80373885
  1. 内排序与外排序:外排序需要利用辅助存储器件(硬盘等),内排序可以全部放入主存储器中。

  2. 基于比较的排序算法和不基于比较的排序算法:基于比较的排序算法时间复杂度最低为O(N * logN),基于非比较的排序算法的复杂度下界为O(N)。

  3. 输入输出序列分散存放在各个进程当中,枚举出全部进程,使用一个全局排序,如果进程Pi枚举值小于Pj,则排序完之后Pi存放的值全都小于Pj。

  4. 每个进程存放一个元素:
    这里写图片描述

  5. 每个进程存放多个元素:使用比较分裂,每个进程将他的块发送给另一个进程,每个进程合并块之后只保留合并块的适当一部分。
    这里写图片描述


排序网络

比较器(递增和递减):
这里写图片描述

双调排序
  1. 复杂度为O(logN * logN)

  2. 双调序列:循环移位之后是一个先增后减的序列

  3. 重排双调序列获得单调递增序列:
    这里写图片描述
    s1取得的是最小值,s2取得的是最大值,所以两个序列包含的元素都不同,且合起来就是原始序列的所有元素。s1和s2的中介点是同一个(在该处s1变为递减,s2变为递增),且因为该处s2的取值大于s1,所以整个s2的值都大于s1。这样子就完成了将一个双调序列变成两个小的双调序列。
    这里写图片描述
    这里写图片描述
    这里写图片描述

双调排序的映射

每个进程一个元素

  1. 第i个最低有效位标号不同的线执行(logn-i +1)次比较-交换操作。

  2. 映射到超立方体上,只需要将标号为l的输入线映射到标号为l的进程。(每次交换都是在标号只差一位的进程上交换。)

    这里写图片描述

  3. 映射到格网上
    这里写图片描述
    这里写图片描述
    这里写图片描述

每个进程一个元素块

  1. 每个进程虚拟成n/p个进程,并行效果差

  2. 使用比较-分裂操作代替比较-交换
    这里写图片描述

  3. 这里写图片描述

冒泡排序及其变体

奇偶排序

串行算法是O(n*n),并行算法是O(n)。
这里写图片描述
这里写图片描述

希尔排序

这里写图片描述

快速排序

把每个子数组分给一个进程,第一次分裂花费的时间是O(N),有N个进程,所以不是成本最优的。

用于CRCW PRAM 的并行形式

在O(1)的时间将数组划分为两个更小的数组 :选出一个主元(每个进程都写同一个内存位置,最后的值就是主元),再得到左右两个主元(也是重复覆盖),被覆盖的值将他的参考主元修改,重复步骤。
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

一个坏的主元可能导致有的进程空闲的划分。如果每个进程的元素最初都均匀分布,那么就能导出一个好的主元选择方法。第一个进程的中值就是全部进程的中值。

桶和样本排序

猜你喜欢

转载自blog.csdn.net/zhougb3/article/details/80373885
今日推荐