Skip to content

Commit 898a0a1

Browse files
authored
Add Tim Sort (#125)
1 parent a1aeafc commit 898a0a1

File tree

1 file changed

+90
-0
lines changed

1 file changed

+90
-0
lines changed

sorting_algorithms/tim_sort.r

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# Insertion Sort: Sort small subarrays (runs)
2+
insertion_sort <- function(arr, left, right) {
3+
for (i in (left + 1):right) {
4+
key <- arr[i]
5+
j <- i - 1
6+
while (j >= left && arr[j] > key) {
7+
arr[j + 1] <- arr[j]
8+
j <- j - 1
9+
}
10+
arr[j + 1] <- key
11+
}
12+
return(arr)
13+
}
14+
15+
# Merge two sorted subarrays
16+
merge <- function(arr, left, mid, right) {
17+
n1 <- mid - left + 1
18+
n2 <- right - mid
19+
20+
left_part <- arr[left:(mid)]
21+
right_part <- arr[(mid + 1):right]
22+
23+
i <- 1
24+
j <- 1
25+
k <- left
26+
27+
# Merge left_part and right_part into arr
28+
while (i <= n1 && j <= n2) {
29+
if (left_part[i] <= right_part[j]) {
30+
arr[k] <- left_part[i]
31+
i <- i + 1
32+
} else {
33+
arr[k] <- right_part[j]
34+
j <- j + 1
35+
}
36+
k <- k + 1
37+
}
38+
39+
# Copy remaining elements of left_part, if any
40+
while (i <= n1) {
41+
arr[k] <- left_part[i]
42+
i <- i + 1
43+
k <- k + 1
44+
}
45+
46+
# Copy remaining elements of right_part, if any
47+
while (j <= n2) {
48+
arr[k] <- right_part[j]
49+
j <- j + 1
50+
k <- k + 1
51+
}
52+
53+
return(arr)
54+
}
55+
56+
# TimSort function
57+
tim_sort <- function(arr) {
58+
n <- length(arr)
59+
min_run <- 32
60+
61+
# Sort individual subarrays of size min_run using insertion sort
62+
for (start in seq(1, n, by = min_run)) {
63+
end <- min(start + min_run - 1, n)
64+
arr <- insertion_sort(arr, start, end)
65+
}
66+
67+
# Merge sorted subarrays
68+
size <- min_run
69+
while (size < n) {
70+
for (left in seq(1, n, by = 2 * size)) {
71+
mid <- min(left + size - 1, n)
72+
right <- min(left + 2 * size - 1, n)
73+
if (mid < right) {
74+
arr <- merge(arr, left, mid, right)
75+
}
76+
}
77+
size <- 2 * size
78+
}
79+
80+
return(arr)
81+
}
82+
83+
# Example usage:
84+
# -------------------
85+
# Input: c(5, 21, 7, 23, 19, 11, 16, 13)
86+
# Expected Output: c(5, 7, 11, 13, 16, 19, 21, 23)
87+
88+
elements_vec <- c(5, 21, 7, 23, 19, 11, 16, 13)
89+
tim_sorted_vec <- tim_sort(elements_vec)
90+
print(tim_sorted_vec)

0 commit comments

Comments
 (0)