void merge_sort_recursive(vector<int> & nums, int low, int high)
{
if (low >= high)
return;
int n = nums.size();
int mid = low + (high - low) /2;
merge_sort_recursive(nums, low, mid);
merge_sort_recursive(nums, mid+1, high);
vector<int> res(n);
int start1 = low, start2 = mid;
int k = low;
while(start1<mid and start2<high)
{
if (nums[start1] < nums[start2])
res[k++] = nums[start1++];
else
res[k++] = nums[start2++];
}
while (start1 < mid)
res[k++] = nums[start1++];
while (start2 < high)
res[k++] = nums[start2++];
for (int i = low; i < high; i++)
nums[i] = res[i];
for (auto i : nums)
{
cout << i << " ";
}
cout << endl;
}
void merge_sort(vector<int> & nums, int low, int high)
{
int n = nums.size();
vector<int> res(n);
for (int len = 1; len < n; len += len)
{
for (int i = 0; i < n; i += len * 2)
{
int low = i, mid = min(i + len, n), high = min(n, i + len * 2);
int start1 = low, end1 = mid;
int start2 = mid, end2 = high;
int k = low;
while(start1 < end1 and start2<end2)
{
if (nums[start1] < nums[start2])
res[k++] = nums[start1++];
else
res[k++] = nums[start2++];
}
while (start1 < end1)
res[k++] = nums[start1++];
while (start2 < end2)
res[k++] = nums[start2++];
}
for (auto i : res)
{
cout << i << " ";
}
cout << endl;
nums = res;
}
}
int main()
{
//vector<vector<char>> grid = { {'1','0','0'},{'1','1','0'},{'0','0','1'} };
//int res = numIslands(grid);
//cout << res << endl;
vector<int> vec = { 1,3,2 ,5};
merge_sort_recursive(vec,0,4);
for (auto i : vec)
{
cout << i << " ";
}
cout << endl;
cout << endl;
merge_sort(vec, 0, 4);
for (auto i : vec)
{
cout << i << " ";
}
cout << endl;
return 0;
}