You are on page 1of 10

S`HH2H aQ`iBM;

S`HH2H S`Q;`KKBM; BM a+H


oBFiQ` EmM+F
J2`;2 aQ`i

q2 rBHH BKTH2K2Mi  T`HH2H K2`;2 bQ`i H;Q`Bi?KX

RX `2+m`bBp2Hv bQ`i i?2 irQ ?Hp2b Q7 i?2 ``v BM T`HH2H


kX b2[m2MiBHHv K2`;2 i?2 irQ ``v ?Hp2b #v +QTvBM; BMiQ  i2KTQ``v
``v
jX +QTv i?2 i2KTQ``v ``v #+F BMiQ i?2 Q`B;BMH ``v

h?2 parMergeSort K2i?Q/ iF2b M ``v- M/  KtBKmK /2Ti?,


J2`;2 aQ`i

q2 rBHH BKTH2K2Mi  T`HH2H K2`;2 bQ`i H;Q`Bi?KX

RX `2+m`bBp2Hv bQ`i i?2 irQ ?Hp2b Q7 i?2 ``v BM T`HH2H


kX b2[m2MiBHHv K2`;2 i?2 irQ ``v ?Hp2b #v +QTvBM; BMiQ  i2KTQ``v
``v
jX +QTv i?2 i2KTQ``v ``v #+F BMiQ i?2 Q`B;BMH ``v

h?2 parMergeSort K2i?Q/ iF2b M ``v- M/  KtBKmK /2Ti?,

def parMergeSort(xs: Array[Int], maxDepth: Int): Unit = {


HHQ+iBM; M AMi2`K2/Bi2 ``v

q2 bi`i #v HHQ+iBM; M BMi2`K2/Bi2 ``v,

val ys = new Array[Int](xs.length)

i 2+? H2p2H Q7 i?2 K2`;2 bQ`i- r2 rBHH Hi2`Mi2 #2ir22M i?2 bQm`+2 ``v
xs M/ i?2 BMi2`K2/Bi2 ``v ysX
aQ`iBM; i?2 ``v

def sort(from: Int, until: Int, depth: Int): Unit = {


if (depth == maxDepth) {
quickSort(xs, from, until - from)
} else {
val mid = (from + until) / 2
parallel(sort(mid, until, depth + 1), sort(from, mid, depth + 1))
aQ`iBM; i?2 ``v

def sort(from: Int, until: Int, depth: Int): Unit = {


if (depth == maxDepth) {
quickSort(xs, from, until - from)
} else {
val mid = (from + until) / 2
parallel(sort(mid, until, depth + 1), sort(from, mid, depth + 1))

val flip = (maxDepth - depth) % 2 == 0


val src = if (flip) ys else xs
val dst = if (flip) xs else ys
merge(src, dst, from, mid, until)
}
}
sort(0, xs.length, 0)
J2`;BM; i?2 ``v

:Bp2M M ``v src +QMbBbiBM; Q7 irQ bQ`i2/ BMi2`pHb- K2`;2 i?Qb2 BMi2`pH
BMiQ i?2 dst ``v,

def merge(src: Array[Int], dst: Array[Int],


from: Int, mid: Int, until: Int): Unit

h?2 merge BKTH2K2MiiBQM Bb b2[m2MiBH- bQ r2 rBHH MQi ;Q i?`Qm;? BiX


J2`;BM; i?2 ``v

:Bp2M M ``v src +QMbBbiBM; Q7 irQ bQ`i2/ BMi2`pHb- K2`;2 i?Qb2 BMi2`pH
BMiQ i?2 dst ``v,

def merge(src: Array[Int], dst: Array[Int],


from: Int, mid: Int, until: Int): Unit

h?2 merge BKTH2K2MiiBQM Bb b2[m2MiBH- bQ r2 rBHH MQi ;Q i?`Qm;? BiX


>Qr rQmH/ vQm BKTH2K2Mi merge BM T`HH2H\
*QTvBM; i?2 ``v

def copy(src: Array[Int], target: Array[Int],


from: Int, until: Int, depth: Int): Unit = {
if (depth == maxDepth) {
Array.copy(src, from, target, from, until - from)
} else {
val mid = (from + until) / 2
val right = parallel(
copy(src, target, mid, until, depth + 1),
copy(src, target, from, mid, depth + 1)
)
}
}
if (maxDepth % 2 == 0) copy(ys, xs, 0, xs.length, 0)
.2KQ

G2iǶb +QKT`2 i?2 T2`7Q`KM+2 Q7 parMergeSort ;BMbi i?2 a+H


quicksort BKTH2K2MiiBQMX

You might also like