## The third example - the merge sort algorithm

The merge sort algorithm is a very popular sorting algorithm, which is often implemented using the divide and conquer technique, so it's a very good candidate to test the fork/join framework.

To implement the merge sort algorithm, we divide the unsorted lists into sublists of one element. Then, we merge those unsorted sublists to produce ordered sublists until we have processed all the sublists, and we have only the original list, but with all the elements sorted.

To make the concurrent version of our algorithm, we have used the `CountedCompleter`

tasks, introduced in Java 8. The most important characteristic of these tasks is that they include a method to be executed when all their child tasks have finished their execution.

To test out implementations, we have used the **Amazon product co-purchasing network metadata** (you can download it from https://snap.stanford.edu/data/amazon-meta.html). In particular, we have created a list with the salesrank of...