# 912. Sort an Array
###### tags: `leetcode`
## Description
Given an array of integers nums, sort the array in ascending order and return it.
You must solve the problem without using any built-in functions in O(nlog(n)) time complexity and with the smallest space complexity possible.
- Example 1:
>Input: nums = [5,2,3,1]
Output: [1,2,3,5]
>>Explanation: After sorting the array, the positions of some numbers are not changed (for example, 2 and 3), while the positions of other numbers are changed (for example, 1 and 5).
- Example 2:
>Input: nums = [5,1,1,2,0,0]
Output: [0,0,1,1,2,5]
>>Explanation: Note that the values of nums are not necessairly unique.
- Constraints:
>$1 \leq nums.length \leq 5 \times 10^4$
$-5 \times 10^4 \leq nums[i] \leq 5 * 10^4$
## Solution
- The sorting algorithm for time complexity `O(n lon n)` is obviously `merge sort`
- The problem can be achieved by splitting the vector and then merge them together afterward
- The easy part is to divide the array, just split in half and do the recursive
```cpp=
int dividesize = arr.size() / 2;
vector<int> merge1, merge2;
for(int i = 0; i < dividesize; i++)
merge1.push_back(arr[i]);
for(int i = dividesize; i < arr.size(); i++)
merge2.push_back(arr[i]);
merge1 = mergeSort(merge1);
merge2 = mergeSort(merge2);
```
- The problem may lies in merging the two vectors. Cosntruct a new vector and keeps tracking the two array, pick the smaller one in the begining and do the insertion
```cpp=
if(merge1[ptr1] < merge2[ptr2])
{
arr[ptr3] = merge1[ptr1];
ptr1++;
ptr3++;
}
else
{
arr[ptr3] = merge2[ptr2];
ptr2++;
ptr3++;
}
```
- When one of the array is empty, add all the rest of the other array into the result
```cpp=
if(ptr1 == merge1.size())
{
arr[ptr3] = merge2[ptr2];
ptr2++;
ptr3++;
continue;
}
if(ptr2 == merge2.size())
{
arr[ptr3] = merge1[ptr1];
ptr1++;
ptr3++;
continue;
}
```