本文主要实现的是二路归并。算法思想是自顶向下分割数组,然后自底向上合并已排序的数组。
归并排序用到了一个辅助数组存放合并两个有序数组的结果,故空间复杂度为
O
(
n
)
O(n)
O(n),时间复杂度为
O
(
n
l
o
g
n
)
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<<" ";
}