From 6398940bb0adc3a5c069b1de594dbf1e7f51861c Mon Sep 17 00:00:00 2001 From: Bas Terwijn Date: Thu, 11 Jun 2026 13:23:58 +0200 Subject: [PATCH 1/2] fix: correct recursive merge sort implementation Fix broken indentation in the merge step, create the temporary buffer only once, and handle empty lists correctly by using low >= up as the recursive base case. --- sorting-algorithms/merge_sort_recursive.py | 96 +++++++++++----------- 1 file changed, 47 insertions(+), 49 deletions(-) diff --git a/sorting-algorithms/merge_sort_recursive.py b/sorting-algorithms/merge_sort_recursive.py index 49eb0a4..e0aa034 100644 --- a/sorting-algorithms/merge_sort_recursive.py +++ b/sorting-algorithms/merge_sort_recursive.py @@ -1,62 +1,60 @@ -# merge_sort_recursive.py : Program of sorting using merge sort through recursion. +# merge_sort_recursive.py -# lst[low1]...lst[up1] and lst[low2]...lst[up2] merged to temp[low1]...temp[up2] def merge(lst, temp, low1, up1, low2, up2): - i = low1 - j = low2 - k = low1 - - while i<=up1 and j<=up2: - if lst[i] < lst[j]: - temp[k] = lst[i] - i += 1 - else: - temp[k] = lst[j] - j += 1 - k += 1 - - while i <= up1: - temp[k] = lst[i] - k += 1 - i += 1 - - while(j <= up2): - temp[k] = lst[j] - k += 1 - j += 1 + i = low1 + j = low2 + k = low1 + + while i <= up1 and j <= up2: + if lst[i] < lst[j]: + temp[k] = lst[i] + i += 1 + else: + temp[k] = lst[j] + j += 1 + k += 1 + + while i <= up1: + temp[k] = lst[i] + i += 1 + k += 1 + + while j <= up2: + temp[k] = lst[j] + j += 1 + k += 1 + def copy(lst, temp, low, up): - i = low - while i<=up: - lst[i] = temp[i] - i += 1 + for i in range(low, up + 1): + lst[i] = temp[i] + + +def merge_sort1(lst, temp, low, up): + if low >= up: + return + + mid = (low + up) // 2 -def merge_sort1(lst, low, up): - temp = [None]*(len(lst)) + merge_sort1(lst, temp, low, mid) + merge_sort1(lst, temp, mid + 1, up) - if low == up: # if only one element - return - - mid = (low+up)//2 - merge_sort1(lst,low,mid) # Sort lst[low]....lst[mid] - merge_sort1(lst,mid+1,up) # Sort lst[mid+1]....lst[up] + merge(lst, temp, low, mid, mid + 1, up) + copy(lst, temp, low, up) - # Merge lst[low]...lst[mid] and lst[mid+1]...lst[up] to temp[low]...temp[up] - merge(lst,temp,low,mid,mid+1,up) - # Copy temp[low]...temp[up] to lst[low]...lst[up] - copy(lst,temp,low,up) +def merge_sort(lst): + temp = [None] * len(lst) + merge_sort1(lst, temp, 0, len(lst) - 1) -def merge_sort(lst, n): - merge_sort1(lst,0,n-1) -if __name__ == '__main__': - data_list = [8, 5, 89, 30, 42, 92, 64, 4, 21, 56, 3] +if __name__ == "__main__": + data_list = [8, 5, 89, 30, 42, 92, 64, 4, 21, 56, 3] - print("Unsorted list is :") - print(data_list) + print("Unsorted list is:") + print(data_list) - merge_sort(data_list,len(data_list)) + merge_sort(data_list) - print("Sorted list is :") - print(data_list) + print("Sorted list is:") + print(data_list) From 9166de6b6a70b2529f20f53514efc5e7b3c9f3ee Mon Sep 17 00:00:00 2001 From: Bas Terwijn Date: Thu, 11 Jun 2026 13:32:55 +0200 Subject: [PATCH 2/2] comments restored --- sorting-algorithms/merge_sort_recursive.py | 36 +++++++++++++--------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/sorting-algorithms/merge_sort_recursive.py b/sorting-algorithms/merge_sort_recursive.py index e0aa034..b5e3263 100644 --- a/sorting-algorithms/merge_sort_recursive.py +++ b/sorting-algorithms/merge_sort_recursive.py @@ -1,12 +1,13 @@ -# merge_sort_recursive.py +# merge_sort_recursive.py : Program of sorting using merge sort through recursion. +# lst[low1]...lst[up1] and lst[low2]...lst[up2] merged to temp[low1]...temp[up2] def merge(lst, temp, low1, up1, low2, up2): i = low1 j = low2 k = low1 while i <= up1 and j <= up2: - if lst[i] < lst[j]: + if lst[i] <= lst[j]: temp[k] = lst[i] i += 1 else: @@ -16,45 +17,50 @@ def merge(lst, temp, low1, up1, low2, up2): while i <= up1: temp[k] = lst[i] - i += 1 k += 1 + i += 1 while j <= up2: temp[k] = lst[j] - j += 1 k += 1 + j += 1 def copy(lst, temp, low, up): - for i in range(low, up + 1): + i = low + while i <= up: lst[i] = temp[i] + i += 1 def merge_sort1(lst, temp, low, up): - if low >= up: + if low >= up: # if only one element return mid = (low + up) // 2 - merge_sort1(lst, temp, low, mid) - merge_sort1(lst, temp, mid + 1, up) + merge_sort1(lst, temp, low, mid) # Sort lst[low]....lst[mid] + merge_sort1(lst, temp, mid + 1, up) # Sort lst[mid+1]....lst[up] + # Merge lst[low]...lst[mid] and lst[mid+1]...lst[up] to temp[low]...temp[up] merge(lst, temp, low, mid, mid + 1, up) + + # Copy temp[low]...temp[up] to lst[low]...lst[up] copy(lst, temp, low, up) -def merge_sort(lst): - temp = [None] * len(lst) - merge_sort1(lst, temp, 0, len(lst) - 1) +def merge_sort(lst, n): + temp = [None] * n + merge_sort1(lst, temp, 0, n - 1) -if __name__ == "__main__": +if __name__ == '__main__': data_list = [8, 5, 89, 30, 42, 92, 64, 4, 21, 56, 3] - print("Unsorted list is:") + print("Unsorted list is :") print(data_list) - merge_sort(data_list) + merge_sort(data_list, len(data_list)) - print("Sorted list is:") + print("Sorted list is :") print(data_list)