本文主要实现的是二路归并。算法思想是自顶向下分割数组,然后自底向上合并已排序的数组。
归并排序用到了一个辅助数组存放合并两个有序数组的结果,故空间复杂度为O(n)O(n)O(n),时间复杂度为O(nlogn)O(nlogn)O(nlogn)。
void merge(vector<int>& v, vector<int>& temp, int left, int right)
{
if(left >= right)
return;
int mid = left + (right - left) / 2;
merge(v, temp, left, mid);
merge(v, temp, mid + 1, right);
int p = left, q = mid + 1, s = left;
while(s <= right)
{
if(p > mid || (q <= right && v[p] >= v[q]))
temp[s++] = v[q++];
else
temp[s++] = v[p++];
}
for(int i = left; i <= right; ++i)
{
v[i] = temp[i];
}
}
int main() {
vector<int> v{3,8,5,9,4,8,3,6,2,5,2,1,3};
int len = v.size();
//辅助数组
vector<int> temp(len, 0);
merge(v, temp, 0, len - 1);
for(auto &i : v)
cout<<i<<" ";
}
本文聚焦于二路归并排序算法,其思想是自顶向下分割数组,再自底向上合并已排序数组。该算法使用辅助数组存放合并结果,空间复杂度为O(n),时间复杂度为O(nlogn)。
113

被折叠的 条评论
为什么被折叠?



