Skip to content

Commit 5fe8aeb

Browse files
Sai Rahul GuggilamSai Rahul Guggilam
authored andcommitted
merge variety
1 parent e2a78d4 commit 5fe8aeb

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

sorts/3_way_Merge_Sort.py

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
'''
2+
In traditional Merge Sort, the array is recursively divided into halves until we reach subarrays of size 1. In 3-way Merge Sort, the array is recursively divided into three parts, reducing the depth of recursion and potentially improving efficiency.
3+
'''
4+
def merge(arr, left, mid1, mid2, right):
5+
6+
# Sizes of three subarrays
7+
size1 = mid1 - left + 1
8+
size2 = mid2 - mid1
9+
size3 = right - mid2
10+
11+
# Temporary arrays for three parts
12+
left_arr = arr[left:left + size1]
13+
mid_arr = arr[mid1 + 1:mid1 + 1 + size2]
14+
right_arr = arr[mid2 + 1:mid2 + 1 + size3]
15+
16+
# Merge three sorted subarrays
17+
i = j = k = 0
18+
index = left
19+
20+
while i < size1 or j < size2 or k < size3:
21+
min_value = float('inf')
22+
min_idx = -1
23+
24+
# Find the smallest among the three current elements
25+
if i < size1 and left_arr[i] < min_value:
26+
min_value = left_arr[i]
27+
min_idx = 0
28+
if j < size2 and mid_arr[j] < min_value:
29+
min_value = mid_arr[j]
30+
min_idx = 1
31+
if k < size3 and right_arr[k] < min_value:
32+
min_value = right_arr[k]
33+
min_idx = 2
34+
35+
# Place the smallest element in the merged array
36+
if min_idx == 0:
37+
arr[index] = left_arr[i]
38+
i += 1
39+
elif min_idx == 1:
40+
arr[index] = mid_arr[j]
41+
j += 1
42+
else:
43+
arr[index] = right_arr[k]
44+
k += 1
45+
46+
index += 1
47+
48+
def three_way_merge_sort(arr, left, right):
49+
50+
# Base case: If single element, return
51+
if left >= right:
52+
return
53+
54+
# Finding two midpoints for 3-way split
55+
mid1 = left + (right - left) // 3
56+
mid2 = left + 2 * (right - left) // 3
57+
58+
# Recursively sort first third
59+
three_way_merge_sort(arr, left, mid1)
60+
61+
# Recursively sort second third
62+
three_way_merge_sort(arr, mid1 + 1, mid2)
63+
64+
# Recursively sort last third
65+
three_way_merge_sort(arr, mid2 + 1, right)
66+
67+
# Merge the sorted parts
68+
merge(arr, left, mid1, mid2, right)
69+
70+
if __name__ == "__main__":
71+
72+
# Input array
73+
arr = [5, 2, 9, 1, 6, 3, 8, 4, 7]
74+
75+
# Calling 3-way merge sort function
76+
three_way_merge_sort(arr, 0, len(arr) - 1)
77+
78+
# Printing the sorted array
79+
print(*arr)

0 commit comments

Comments
 (0)