Merge Sort

Using vector and pointers

void merge(int arr[], int l, int m, int r)
{
    vector<int> left(arr + l, arr + m + 1);
    vector<int> right(arr + m + 1, arr + r + 1);
    
    int index = l;
    
    int p1 = 0, p2 = 0;
    
    while(p1 < left.size() && p2 < right.size()) 
        if(left[p1] < right[p2])
            arr[index++] = left[p1++];
        else
            arr[index++] = right[p2++];
            
    while(p1 < left.size())
        arr[index++] = left[p1++];
        
    while(p2 < right.size())
        arr[index++] = right[p2++];
        
    
}

void mergeSort(int arr[], int l, int r)
{
    if(l < r) {
        int mid = r + ((l - r) >> 1);
        mergeSort(arr, l, mid);
        mergeSort(arr, mid + 1, r);
        merge(arr, l, mid, r);
    }
}

Using Iterator

void merge(int arr[], int l, int m, int r)
{
    vector<int> left(arr + l, arr + m + 1);
    vector<int> right(arr + m + 1, arr + r + 1);
    
    int arrIndex = l;
    
    vector<int>::iterator leftVal = left.begin(), rightVal = right.begin();
    
    while(leftVal != left.end() && rightVal != right.end()) 
        arr[arrIndex++] =  (*leftVal < *rightVal) ? *(leftVal++) : *(rightVal++);
        
    while(leftVal != left.end())
        arr[arrIndex++] = *(leftVal++);
        
    while(rightVal != right.end())
        arr[arrIndex++] = *(rightVal++);
}

void mergeSort(int arr[], int l, int r)
{
    if(l < r) {
        int mid = l + ((r - l) >> 1);
        mergeSort(arr, l, mid);
        mergeSort(arr, mid + 1, r);
        merge(arr, l, mid, r);
    }
}

Last updated