Skip to content

Commit ea0624f

Browse files
Create Tim Sort.go
add hactoberfest-accepted label
1 parent 495cff8 commit ea0624f

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

sort/Tim Sort.go

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package main
2+
3+
import "fmt"
4+
5+
const run = 32
6+
7+
func insertionSort(arr []int, left, right int) {
8+
for i := left + 1; i <= right; i++ {
9+
temp := arr[i]
10+
j := i - 1
11+
for j >= left && arr[j] > temp {
12+
arr[j+1] = arr[j]
13+
j--
14+
}
15+
arr[j+1] = temp
16+
}
17+
}
18+
19+
func mergeTim(arr []int, l, m, r int) {
20+
left := append([]int(nil), arr[l:m+1]...)
21+
right := append([]int(nil), arr[m+1:r+1]...)
22+
23+
i, j, k := 0, 0, l
24+
for i < len(left) && j < len(right) {
25+
if left[i] <= right[j] {
26+
arr[k] = left[i]
27+
i++
28+
} else {
29+
arr[k] = right[j]
30+
j++
31+
}
32+
k++
33+
}
34+
35+
for i < len(left) {
36+
arr[k] = left[i]
37+
i++
38+
k++
39+
}
40+
41+
for j < len(right) {
42+
arr[k] = right[j]
43+
j++
44+
k++
45+
}
46+
}
47+
48+
func timSort(arr []int, n int) {
49+
for i := 0; i < n; i += run {
50+
insertionSort(arr, i, min((i+run-1), (n-1)))
51+
}
52+
53+
size := run
54+
for size < n {
55+
for left := 0; left < n; left += 2 * size {
56+
mid := min(left+size-1, n-1)
57+
right := min((left + 2*size - 1), (n-1))
58+
59+
if mid < right {
60+
mergeTim(arr, left, mid, right)
61+
}
62+
}
63+
size *= 2
64+
}
65+
}
66+
67+
func min(x, y int) int {
68+
if x < y {
69+
return x
70+
}
71+
return y
72+
}
73+
74+
func main() {
75+
arr := []int{34, 2, 78, 12, 45, 21, 67, 1}
76+
timSort(arr, len(arr))
77+
fmt.Println("Tim Sorted array:", arr)
78+
}

0 commit comments

Comments
 (0)