|
1 | 1 | # Merge Sort Algorithm |
2 | 2 | # Language: Python |
3 | 3 | # Category: Sorting |
| 4 | +# Difficulty: Medium |
4 | 5 | # Time Complexity: O(n log n) |
5 | 6 | # Space Complexity: O(n) |
6 | 7 |
|
7 | 8 | """ |
8 | | -Merge Sort is a classic Divide and Conquer algorithm. |
| 9 | +Merge Sort is a Divide and Conquer algorithm that recursively divides |
| 10 | +an array into halves, sorts each half, and merges the sorted halves into |
| 11 | +a single sorted array. |
9 | 12 |
|
10 | | -It works in three main steps: |
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. |
| 13 | +Steps: |
| 14 | +1. Divide: Split the array into two halves. |
| 15 | +2. Conquer: Recursively sort each half. |
| 16 | +3. Combine: Merge the sorted halves. |
14 | 17 |
|
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. |
| 18 | +Complexity Analysis: |
| 19 | +- Time Complexity: O(n log n) |
| 20 | +- Space Complexity: O(n) |
22 | 21 | """ |
23 | 22 |
|
24 | 23 | def merge_sort(arr): |
| 24 | + """Performs merge sort and returns a sorted list.""" |
25 | 25 | if len(arr) <= 1: |
26 | 26 | return arr |
27 | 27 |
|
28 | | - # Step 1: Divide |
29 | 28 | mid = len(arr) // 2 |
30 | | - left = arr[:mid] |
31 | | - right = arr[mid:] |
32 | | - |
33 | | - # Step 2: Conquer (sort recursively) |
34 | | - left_sorted = merge_sort(left) |
35 | | - right_sorted = merge_sort(right) |
| 29 | + left_sorted = merge_sort(arr[:mid]) |
| 30 | + right_sorted = merge_sort(arr[mid:]) |
36 | 31 |
|
37 | | - # Step 3: Combine (merge results) |
38 | 32 | return merge(left_sorted, right_sorted) |
39 | 33 |
|
40 | 34 |
|
41 | 35 | def merge(left, right): |
42 | | - result = [] |
| 36 | + """Merges two sorted lists into one sorted list.""" |
| 37 | + merged = [] |
43 | 38 | i = j = 0 |
44 | 39 |
|
45 | | - # Compare and merge |
46 | 40 | while i < len(left) and j < len(right): |
47 | 41 | if left[i] <= right[j]: |
48 | | - result.append(left[i]) |
| 42 | + merged.append(left[i]) |
49 | 43 | i += 1 |
50 | 44 | else: |
51 | | - result.append(right[j]) |
| 45 | + merged.append(right[j]) |
52 | 46 | j += 1 |
53 | 47 |
|
54 | | - # Add remaining elements |
55 | | - result.extend(left[i:]) |
56 | | - result.extend(right[j:]) |
57 | | - return result |
| 48 | + merged.extend(left[i:]) |
| 49 | + merged.extend(right[j:]) |
| 50 | + return merged |
58 | 51 |
|
59 | 52 |
|
| 53 | +# Example Test Cases |
60 | 54 | if __name__ == "__main__": |
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) |
| 55 | + test_cases = [ |
| 56 | + [38, 27, 43, 3, 9, 82, 10], |
| 57 | + [5, 2, 8, 1, 3], |
| 58 | + [], |
| 59 | + [1], |
| 60 | + [10, 10, 10], |
| 61 | + ] |
| 62 | + |
| 63 | + for i, arr in enumerate(test_cases, 1): |
| 64 | + print(f"Test Case {i}:") |
| 65 | + print("Original:", arr) |
| 66 | + print("Sorted: ", merge_sort(arr)) |
| 67 | + print("-" * 30) |
0 commit comments