Sorting(排序)

  1. 内排序与外排序:外排序需要利用辅助存储器件(硬盘等),内排序可以全部放入主存储器中。

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

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

  4. 每个进程存放一个元素:
    Sorting(排序)

  5. 每个进程存放多个元素:使用比较分裂,每个进程将他的块发送给另一个进程,每个进程合并块之后只保留合并块的适当一部分。
    Sorting(排序)


排序网络

比较器(递增和递减):
Sorting(排序)

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

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

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

双调排序的映射

每个进程一个元素

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

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

    Sorting(排序)

  3. 映射到格网上
    Sorting(排序)
    Sorting(排序)
    Sorting(排序)

每个进程一个元素块

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

  2. 使用比较-分裂操作代替比较-交换
    Sorting(排序)

  3. Sorting(排序)

冒泡排序及其变体

奇偶排序

串行算法是O(n*n),并行算法是O(n)。
Sorting(排序)
Sorting(排序)

希尔排序

Sorting(排序)

快速排序

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

用于CRCW PRAM 的并行形式

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

Sorting(排序)

Sorting(排序)

Sorting(排序)

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

桶和样本排序