void _Merge(int arr[], int* tmp, int begin1, int end1, int begin2, int end2)
{
int index = begin1;
while (begin1 <= end1&&begin2 <= end2)
{
tmp[index++] = arr[begin1]<arr[begin2] ? arr[begin1++] : arr[begin2++];
}
while (begin1 <= end1)
{
tmp[index++] = arr[begin1++];
}
while (begin2 <= end2)
{
tmp[index++] = arr[begin2++];
}
}
void MergeSort_NonR(int* A,int* tmp, int n)
{
int step = 2;
int left = 0, right = 0, mid = 0;
while (step <= n)
{
int cur = 0;
while (cur + step <= n)
{
right = cur + step-1, left = cur;
mid = (left + right) / 2;
_Merge(A, tmp, left, mid, mid + 1, right);
cur += step;
}
if (cur < n - 1)
{
mid = (cur + n-1) / 2;
_Merge(A, tmp, cur, mid, mid + 1, n);
}
step *= 2;
}
mid = (0 + n-1) / 2;
_Merge(A, tmp, 0, mid, mid + 1, n - 1);
}
int* mergeSort(int* A, int n)
{
if (A == NULL || n <= 0)
return A;
int* tmp = new int[n];
memset(tmp, 0, sizeof(tmp));
MergeSort_NonR(A, tmp, n);
delete[] tmp;
return A;
}
归并排序非递归写法
最新推荐文章于 2022-08-01 19:49:16 发布