Improve python version of merge sort. (#23005)

This commit is contained in:
Rajat Bhatt
2018-12-02 11:29:26 +05:30
committed by Kristofer Koishigawa
parent 213425fac2
commit 01ae4e25a1

View File

@ -211,46 +211,37 @@ void mergesort(int A[],int size_a,int B[],int size_b,int C[])
### Implementation in Python ### Implementation in Python
```python ```python
temp = None def merge(left,right,compare):
def merge(arr, left, right): result = []
global temp, inversions i,j = 0,0
mid = (left + right) // 2 while (i < len(left) and j < len(right)):
for i in range(left, right + 1): if compare(left[i],right[j]):
temp[i] = arr[i] result.append(left[i])
i += 1
k, L, R = left, left, mid + 1 else:
while L <= mid and R <= right: result.append(right[j])
if temp[L] <= temp[R]: j += 1
arr[k] = temp[L] while (i < len(left)):
L += 1 result.append(left[i])
else: i += 1
arr[k] = temp[R] while (j < len(right)):
R += 1 result.append(right[j])
k += 1 j += 1
return result
while L <= mid:
arr[k] = temp[L]
L += 1
k += 1
while R <= right:
arr[k] = temp[R]
R += 1
k += 1
def merge_sort(arr, left, right):
if left >= right:
return
mid = (left + right) // 2
merge_sort(arr, left, mid)
merge_sort(arr, mid + 1, right)
merge(arr, left, right)
arr = [1,6,3,1,8,4,2,9,3] def merge_sort(arr, compare = lambda x, y: x < y):
temp = [None for _ in range(len(arr))] #Used lambda function to sort array in both(increasing and decresing) order.
merge_sort(arr, 0, len(arr) - 1) #By default it sorts array in increasing order
print(arr, inversions) if len(arr) < 2:
return arr[:]
else:
middle = len(arr) // 2
left = merge_sort(arr[:middle], compare)
right = merge_sort(arr[middle:], compare)
return merge(left, right, compare)
arr = [2,1,4,5,3]
print(merge_sort(arr))
``` ```
### Implementation in Java ### Implementation in Java