归并排序是分治法的有效应用,算法步骤是:
1.通过递归拆分数组
2.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
3.设定两个指针,最初位置分别为两个已经排序序列的起始位置;
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重复步骤 3 直到某一指针达到序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾。
例题:leetcode 215
数组中的第K个最大元素
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
int tmp[1000000] = { 0 };
class Solution {
public:
void sort_merge(vector<int>& nums, int l, int r) {
if (l >= r) {
return;
}
int mid = (l + r) / 2;
//1.分割
sort_merge(nums, l, mid);
sort_merge(nums, mid + 1, r);
//2.合并,需要开辟额外空间
int k = 0; int i = l; int j = mid + 1;
while (i <= mid && j <= r)
{
if (nums[i] <= nums[j])
{
tmp[k++] = nums[i++];
}
else {
tmp[k++] = nums[j++];
}
}
while (i <= mid) tmp[k++] = nums[i++];
while (j <= r) tmp[k++] = nums[j++];
//将临时数组中的数组拷回nums
for (int k = 0, t = l; k < r - l + 1; k++)
{
nums[t++] = tmp[k];
}
}
};