Improve python version of merge sort. (#23005)
This commit is contained in:
committed by
Kristofer Koishigawa
parent
213425fac2
commit
01ae4e25a1
@ -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
|
|
||||||
while L <= mid and R <= right:
|
|
||||||
if temp[L] <= temp[R]:
|
|
||||||
arr[k] = temp[L]
|
|
||||||
L += 1
|
|
||||||
else:
|
else:
|
||||||
arr[k] = temp[R]
|
result.append(right[j])
|
||||||
R += 1
|
j += 1
|
||||||
k += 1
|
while (i < len(left)):
|
||||||
|
result.append(left[i])
|
||||||
|
i += 1
|
||||||
|
while (j < len(right)):
|
||||||
|
result.append(right[j])
|
||||||
|
j += 1
|
||||||
|
return result
|
||||||
|
|
||||||
while L <= mid:
|
def merge_sort(arr, compare = lambda x, y: x < y):
|
||||||
arr[k] = temp[L]
|
#Used lambda function to sort array in both(increasing and decresing) order.
|
||||||
L += 1
|
#By default it sorts array in increasing order
|
||||||
k += 1
|
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)
|
||||||
|
|
||||||
while R <= right:
|
arr = [2,1,4,5,3]
|
||||||
arr[k] = temp[R]
|
print(merge_sort(arr))
|
||||||
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]
|
|
||||||
temp = [None for _ in range(len(arr))]
|
|
||||||
merge_sort(arr, 0, len(arr) - 1)
|
|
||||||
print(arr, inversions)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Implementation in Java
|
### Implementation in Java
|
||||||
|
Reference in New Issue
Block a user