算法:将两段有序的数据合并为一段有序的数据,先一个一个有序,然后两个两个有序,再四个四个有序直到所有的数据有序
时间复杂度为O(nlogn),空间复杂度为O(n),稳定性好
void Merge(vector<int>& vec, int gap)
{
int len = vec.size();
int low1 = 0;
int high1 = low1 + gap - 1;
int low2 = high1 + 1;
int high2 = low2 + gap - 1 < len ? low2 + gap - 1 : len - 1;
vector<int> des(len,0);
int i = 0;
while (low2 < len)
{
while (low1 <= high1 && low2 <= high2)
{
if (vec[low1] <= vec[low2])
{
des[i++] = vec[low1++];
}
else
{
des[i++] = vec[low2++];
}
}
while (low1 <= high1)
{
des[i++] = vec[low1++];
}
while (low2 <= high2)
{
des[i++] = vec[low2++];
}
low1 = high2 + 1;
high1 = low1 + gap - 1;
low2 = high1 + 1;
high2 = low2 + gap - 1 < len ? low2 + gap - 1 : len - 1;
}
while (low1 < len)
{
des[i++] = vec[low1++];
}
for (int i = 0;i<len;++i)
{
vec[i] = des[i];
}
}
void MergeSort(vector<int>& vec)
{
int len = vec.size();
if (len <= 1) return;
for (int i = 1; i < len; i *= 2)
{
Merge(std::ref(vec),i);
}
}
int main()
{
vector<int> vec{ 12,89,67,23,34,78,56,45,100,90 };
MergeSort(std::ref(vec));
for (auto& x : vec)
{
cout << x << endl;
}
return 0;
}