Sorting
Merge Sort (Top-Down)
Split the array recursively, sort each half, then merge two sorted runs into one sorted result.
Algorithm
Basic Implementation
basic.R
merge_sort <- function(values) {
if (length(values) <= 1) return(values)
mid <- floor(length(values) / 2)
left <- merge_sort(values[1:mid])
right <- merge_sort(values[(mid + 1):length(values)])
merged <- c()
i <- 1; j <- 1
while (i <= length(left) && j <= length(right)) {
if (left[i] <= right[j]) { merged <- c(merged, left[i]); i <- i + 1 }
else { merged <- c(merged, right[j]); j <- j + 1 }
}
if (i <= length(left)) merged <- c(merged, left[i:length(left)])
if (j <= length(right)) merged <- c(merged, right[j:length(right)])
merged
}
arr <- merge_sort(c(5, 1, 4, 2, 8))
cat("[", paste(arr, collapse = ", "), "]
", sep = "")
Complexity
- Time: O(n log n)
- Space: O(n)
- Stable: yes
Implementation notes
- The checked input is passed directly as an R vector:
merge_sort(c(5, 1, 4, 2, 8)). merge_sort <- function(values)returns a new sorted vector; it does not sort the caller's vector in place.- The base case is
if (length(values) <= 1) return(values). - R indexing is 1-based, so
mid <- floor(length(values) / 2)splits this five-value input intovalues[1:2]andvalues[3:5]. - The recursive calls are
left <- merge_sort(values[1:mid])andright <- merge_sort(values[(mid + 1):length(values)]). merged <- c()starts an empty vector for the merge result.- The merge cursors start at
i <- 1; j <- 1. - The main merge loop is
while (i <= length(left) && j <= length(right)). - The comparison is
left[i] <= right[j]; the left side wins ties in this source. - Appends use vector concatenation, for example
merged <- c(merged, left[i]). - Leftover values are appended with slices:
left[i:length(left)]orright[j:length(right)].
Replay steps
input: [5, 1, 4, 2, 8]
split: left [5, 1], right [4, 2, 8]
sorted: left [1, 5], right [2, 4, 8]
merged: [1, 2, 4, 5, 8]
- The final
catcall combines"[",paste(arr, collapse = ", "), and a closing bracket string that contains the newline, so it prints[1, 2, 4, 5, 8].
divide and conquer
Each recursive call solves a smaller sorted subproblem.
merge step
Two sorted halves are combined by repeatedly taking the smaller front item.