Increasing decresing array sort
Given an array whose elements are in increasing-decreasing order, sort them in the most effecient manner.
Example
Input: 1, 5, 10, 15, 13, 11, 12, 14, 20, 18, 16, 17, 19, 30
       ----------><------><----------><------><-----------
Solution
- Split the array into a set of sorted increasing arrays
 - Then use merge them using a min heap
 
Code
def sort_increasing_decreasing(arr)
    i = 0
    j = 0
    result = [[]]
    increasing = true
    while i < arr.size
        if arr[i] < arr[i+1] && increasing
            result[j].push(arr[i])
            i += 1
        elsif arr[i] > arr[i+1] && !increasing
            result[j].unshift(arr[i])
            i += 1
        end
        j += 1
        increasing = increasing ? false : true
    end
    sorted_result = merge_sorted_arrays(result)
end
Complexity
- Time
- O(n) to split the array into increasing sub-arrays,
 - O(n * log n) to merge sorted arrays using min heap
 
 - Space
- O(n) extra space to hold the sorted sub-arrays
 - We could just do it using pointers to prevent using extra space