|
1 | | -def merge_sort(array, left, right): |
| 1 | + |
| 2 | +def merge_sort(array): |
2 | 3 | # derive the mid-point
|
3 | | - if left < right: |
4 | | - mid = (left+(right-1))//2 |
5 | | - # print("mid", mid) |
| 4 | + if len(array) > 1: |
| 5 | + mid = len(array)//2 |
| 6 | + |
| 7 | + # create the temp sub-arrays |
| 8 | + LEFT = array[ :mid] |
| 9 | + RIGHT = array[mid: ] |
6 | 10 |
|
7 | 11 | # sort the first and second halves
|
8 | | - merge_sort(array, left, mid) |
9 | | - merge_sort(array, mid+1, right) |
10 | | - # merge back |
11 | | - merge(array, left, mid, right) |
12 | | - |
13 | | -def merge(array, left, mid, right): |
14 | | - # initialize sizes for the sub-arrays |
15 | | - size_left = mid - left + 1 |
16 | | - # print("size_left", size_left) |
17 | | - size_right = right - mid |
18 | | - # print("size_right", size_right) |
19 | | - |
20 | | - # create the temp sub-arrays |
21 | | - LEFT = [0] * (size_left) |
22 | | - # print("LEFT", LEFT) |
23 | | - RIGHT = [0] * (size_right) |
24 | | - # print("RIGHT", RIGHT) |
25 | | - |
26 | | - # copy data to the sub-arrays |
27 | | - for i in range(0, size_left): |
28 | | - LEFT[i] = array[left + i] |
29 | | - |
30 | | - for j in range(0, size_right): |
31 | | - RIGHT[j] = array[mid + 1 + j] |
32 | | - |
33 | | - # merge into original array |
34 | | - i, j, k = 0, 0, 1 |
35 | | - |
36 | | - while i < size_left and j < size_right: |
37 | | - if LEFT[i] <= RIGHT[j]: |
| 12 | + merge_sort(LEFT) |
| 13 | + merge_sort(RIGHT) |
| 14 | + |
| 15 | + # begin addig elements in sorted order |
| 16 | + i, j, k = 0, 0, 1 |
| 17 | + |
| 18 | + while i < len(LEFT) and j < len(RIGHT): |
| 19 | + if LEFT[i] < RIGHT[j]: |
| 20 | + array[k] = LEFT[i] |
| 21 | + i += 1 |
| 22 | + else: |
| 23 | + array[k] = RIGHT[j] |
| 24 | + j += 1 |
| 25 | + k += 1 |
| 26 | + |
| 27 | + # copy the remaining data |
| 28 | + while i < len(LEFT): |
38 | 29 | array[k] = LEFT[i]
|
39 | 30 | i += 1
|
40 | | - else: |
| 31 | + k += 1 |
| 32 | + |
| 33 | + while j < len(RIGHT): |
41 | 34 | array[k] = RIGHT[j]
|
42 | 35 | j += 1
|
43 | | - k += 1 |
| 36 | + k += 1 |
44 | 37 |
|
45 | 38 | arr = [6, 5, 3, 1, 8, 7, 2, 4]
|
46 | | -merge_sort(arr, 0, len(arr)) |
| 39 | +merge_sort(arr) |
| 40 | +print(arr) |
0 commit comments