|
1 | | -# 📌 Merge Sort Algorithm |
| 1 | +# Merge Sort Algorithm |
2 | 2 | # Language: Python |
3 | 3 | # Category: Sorting |
4 | 4 | # Time Complexity: O(n log n) |
5 | 5 | # Space Complexity: O(n) |
6 | 6 |
|
7 | 7 | """ |
8 | 8 | Merge Sort is a classic Divide and Conquer algorithm. |
| 9 | +
|
9 | 10 | It works in three main steps: |
10 | | -1. Divide: Split the array into two halves. |
11 | | -2. Conquer: Recursively sort the two halves. |
12 | | -3. Combine: Merge the two sorted halves into a single sorted array. |
| 11 | +1 Divide: Split the array into two halves. |
| 12 | +2 Conquer: Recursively sort both halves. |
| 13 | +3 Combine: Merge the sorted halves into a single sorted array. |
| 14 | +
|
| 15 | +Key Advantages: |
| 16 | +- Guaranteed O(n log n) performance. |
| 17 | +- Stable sorting algorithm. |
| 18 | +- Ideal for large datasets. |
| 19 | +
|
| 20 | +Drawback: |
| 21 | +- Requires extra space (O(n)) for merging. |
13 | 22 | """ |
14 | 23 |
|
15 | 24 | def merge_sort(arr): |
16 | | - """ |
17 | | - Sorts the input list 'arr' using the Merge Sort algorithm. |
18 | | - :param arr: list of elements (int/float) to be sorted |
19 | | - :return: sorted list |
20 | | - """ |
21 | | - # Base condition: if array has 0 or 1 elements, it's already sorted |
22 | 25 | if len(arr) <= 1: |
23 | 26 | return arr |
24 | 27 |
|
25 | | - # Step 1: Divide the array into two halves |
| 28 | + # Step 1: Divide |
26 | 29 | mid = len(arr) // 2 |
27 | | - left_half = merge_sort(arr[:mid]) |
28 | | - right_half = merge_sort(arr[mid:]) |
| 30 | + left = arr[:mid] |
| 31 | + right = arr[mid:] |
29 | 32 |
|
30 | | - # Step 2: Merge the sorted halves |
31 | | - return merge(left_half, right_half) |
| 33 | + # Step 2: Conquer (sort recursively) |
| 34 | + left_sorted = merge_sort(left) |
| 35 | + right_sorted = merge_sort(right) |
| 36 | + |
| 37 | + # Step 3: Combine (merge results) |
| 38 | + return merge(left_sorted, right_sorted) |
32 | 39 |
|
33 | 40 |
|
34 | 41 | def merge(left, right): |
35 | | - """ |
36 | | - Merges two sorted lists 'left' and 'right' into a single sorted list. |
37 | | - :param left: sorted list |
38 | | - :param right: sorted list |
39 | | - :return: merged sorted list |
40 | | - """ |
41 | | - merged = [] |
| 42 | + result = [] |
42 | 43 | i = j = 0 |
43 | 44 |
|
44 | | - # Compare elements of both halves and add the smaller one |
| 45 | + # Compare and merge |
45 | 46 | while i < len(left) and j < len(right): |
46 | 47 | if left[i] <= right[j]: |
47 | | - merged.append(left[i]) |
| 48 | + result.append(left[i]) |
48 | 49 | i += 1 |
49 | 50 | else: |
50 | | - merged.append(right[j]) |
| 51 | + result.append(right[j]) |
51 | 52 | j += 1 |
52 | 53 |
|
53 | | - # If there are remaining elements in left or right, add them |
54 | | - merged.extend(left[i:]) |
55 | | - merged.extend(right[j:]) |
56 | | - |
57 | | - return merged |
| 54 | + # Add remaining elements |
| 55 | + result.extend(left[i:]) |
| 56 | + result.extend(right[j:]) |
| 57 | + return result |
58 | 58 |
|
59 | 59 |
|
60 | | -# 🧪 Example usage |
61 | 60 | if __name__ == "__main__": |
62 | | - sample_array = [38, 27, 43, 3, 9, 82, 10] |
63 | | - print("Original array:", sample_array) |
64 | | - sorted_array = merge_sort(sample_array) |
65 | | - print("Sorted array:", sorted_array) |
| 61 | + data = [38, 27, 43, 3, 9, 82, 10] |
| 62 | + print("Original Array:", data) |
| 63 | + sorted_data = merge_sort(data) |
| 64 | + print("Sorted Array:", sorted_data) |
0 commit comments