-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparallel-quicksort.fss
More file actions
40 lines (34 loc) · 1.51 KB
/
parallel-quicksort.fss
File metadata and controls
40 lines (34 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
let rec quicksort values =
match values with
| [] -> []
| pivot :: rest ->
let smaller = rest |> List.filter (fun value -> value < pivot)
let equal = rest |> List.filter (fun value -> value = pivot)
let greater = rest |> List.filter (fun value -> value > pivot)
(quicksort smaller) @ [pivot] @ equal @ (quicksort greater)
let rec parallel_quicksort values =
match values with
| [] -> []
| [single] -> [single]
| pivot :: rest ->
let smaller = rest |> List.filter (fun value -> value < pivot)
let equal = rest |> List.filter (fun value -> value = pivot)
let greater = rest |> List.filter (fun value -> value > pivot)
let sort_smaller =
Task.spawn (fun _ -> parallel_quicksort smaller)
let sorted_greater = parallel_quicksort greater
let sorted_smaller = Task.await sort_smaller
sorted_smaller @ [pivot] @ equal @ sorted_greater
let rec is_sorted values =
match values with
| [] -> true
| [_] -> true
| first :: second :: tail -> (first <= second) && (is_sorted (second :: tail))
let input = [9; 2; 8; 2; 4; 7; 1; 6; 3; 5; 3; 10; 0; 12; 11]
let sequential = quicksort input
let parallel = parallel_quicksort input
Console.writeLine $"parallel quicksort input : {input}"
Console.writeLine $"sequential quicksort output : {sequential}"
Console.writeLine $"parallel quicksort output : {parallel}"
Console.writeLine $"same result : {sequential = parallel}"
Console.writeLine $"parallel output is sorted : {is_sorted parallel}"