#include <iostream>
#include <math.h>
using namespace std;
// 要求[i1, j1], [i2, j2]两段已经排序
template <typename T>
void _merge(T a[], unsigned i1, unsigned j1, unsigned i2, unsigned j2)
{
if (i2 == i1)
return;
unsigned pos = i1;
T *temp = new T[j2 - i1 + 1];
unsigned k = 0;
while (i1 <= j1 && i2 <= j2)// 两组均未全部放入temp
{
if (a[i1] <= a[i2])
{
temp[k++] = a[i1++];
}
else
{
temp[k++] = a[i2++];
}
}
while (i1 <= j1)// 第二组已全部放入,第一组未全部放入temp
{
temp[k++] = a[i1++];
}
while (i2 <= j2)// 第一组已全部放入,第二组为全部放入temp
{
temp[k++] = a[i2++];
}
for (unsigned i = 0; i < k; i++)
{
a[pos + i] = temp[i];
}
delete[] temp;
}
// 方法一
template <typename T>
void MergeSort(T a[], unsigned n)
{
for (size_t size = 1; size < n; size *= 2)
{
unsigned i1 = 0;
while (i1 + size < n)
{
unsigned i2 = i1 + size;
unsigned j1 = i2 - 1;
int j2;
if (i2 + size - 1 > n - 1)
{
j2 = n - 1;
}
else
{
j2 = i2 + size - 1;
}
_merge(a, i1, j1, i2, j2);
i1 = j2 + 1;
}
}
}
// 方法二
template <typename T>
void MergeSort_2(T a[], unsigned n)
{
for (size_t size = 1; size < n; size *= 2)
{
for (size_t i = 0; i < ceilf((float)n / (2.0f * size)); i++)
{
unsigned i1 = i * 2 * size, j1 = i * 2 * size + size - 1;
unsigned i2 = i * 2 * size + size, j2 = i * 2 * size + 2 * size - 1;
int r = (i + 1) * 2 * size - n;
if (r > 0)// 最后一段不满
{
_merge(a, i1, j1, i2, j2 - r);
}
else
{
_merge(a, i1, j1, i2, j2);
}
}
}
}
int main()
{
int a[] = {48, 36, 72, 68, 48, 12, 2};
MergeSort_2(a, 7);
for (size_t i = 0; i < 7; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
归并排序(非递归)
最新推荐文章于 2022-01-23 16:29:50 发布