上一篇我们写到的是归并排序分治算法是用递归来实现的,但是其实我们自己观察可以写出一种不需要递归的方法,就是我们可以不需要分解的步骤,直接把序列当做已经分解好的序列来进行合并即可。
代码实现:
// 归并排序非递归实现
void MergeSortNonR(int* arr, int size)
{
int gap = 1;
int* temp = (int*)malloc(size * sizeof(int));
if (NULL == temp)
{
assert(0);
return;
}
while (gap < size)
{
for (int i = 0; i < size; i += 2 * gap)
{
int left = i;
int mid = left + gap;
int right = mid + gap;
if (mid > size)
mid = size;
if (right > size)
right = size;
MergeData(arr, left, mid, right, temp);
}
memcpy(arr, temp, size * sizeof(arr[0]));
gap <<= 1;
}
free(temp);
}