← Sorting

Merge Sort

Medium
Python
def merge_sort(arr):
    if len(arr)<=1: return arr
    mid=len(arr)//2
    l=merge_sort(arr[:mid]); r=merge_sort(arr[mid:])
    res=[]; i=j=0
    while i<len(l) and j<len(r):
        if l[i]<=r[j]: res.append(l[i]); i+=1
        else: res.append(r[j]); j+=1
    return res+l[i:]+r[j:]
Java
public int[] mergeSort(int[] arr){
    if(arr.length<=1) return arr;
    int mid=arr.length/2;
    int[] l=mergeSort(Arrays.copyOfRange(arr,0,mid));
    int[] r=mergeSort(Arrays.copyOfRange(arr,mid,arr.length));
    int[] res=new int[arr.length]; int i=0,j=0,k=0;
    while(i<l.length&&j<r.length) res[k++]=l[i]<=r[j]?l[i++]:r[j++];
    while(i<l.length) res[k++]=l[i++];
    while(j<r.length) res[k++]=r[j++];
    return res;
}

Key Insight

Python slicing trivial. Java needs Arrays.copyOfRange(). res+l[i:] vs while loops.

Python → Java Differences

  • Slicing vs Arrays.copyOfRange()
  • res+l[i:] vs while loops
  • Pre-allocated Java
Python
def merge_sort(arr):
    if len(arr)<=1: return arr
    mid=len(arr)//2
    l=merge_sort(arr[:mid]); r=merge_sort(arr[mid:])
    res=[]; i=j=0
    while i<len(l) and j<len(r):
        if l[i]<=r[j]: res.append(l[i]); i+=1
        else: res.append(r[j]); j+=1
    return res+l[i:]+r[j:]
Java
public int[] mergeSort(int[] arr){
    if(arr.length<=1) return arr;
    int mid=arr.length/2;
    int[] l=mergeSort(Arrays.copyOfRange(arr,0,mid));
    int[] r=mergeSort(Arrays.copyOfRange(arr,mid,arr.length));
    int[] res=new int[arr.length]; int i=0,j=0,k=0;
    while(i<l.length&&j<r.length) res[k++]=l[i]<=r[j]?l[i++]:r[j++];
    while(i<l.length) res[k++]=l[i++];
    while(j<r.length) res[k++]=r[j++];
    return res;
}

Algorithm Steps

1. Split
2. Recurse
3. Merge