归并排序的非递归实现是直接从最低下开始合并,从子序列长度为1的合并成子序列长度为2的,然后再将子序列长度为2的两个子序列合并成长度为4的,直到合并完,相信大家并不陌生,原理很简单。
#include<iostream>
#include<stdlib.h>
using namespace std;
void Merge(int* a, int* b, int s, int m, int n)
{// 合并 把有序的 a[s...m]和 a[m+1...n]合并到b[s...m]
int i, j, k;
for(i = s, j = m + 1, k = s; i <= m && j <= n; k++)
{
if(a[i] <= a[j])
b[k] = a[i++];
else
b[k] = a[j++];
}
while(i <= m)
{
b[k++] = a[i++];
}
while(j <= n)
{
b[k++] = a[j++];
}
}
//将相邻的两个长度为s的子序列合并
void MergePass(int* a, int* b, int s, int n)
{
int i = 1;// 从数组下标为1的元素开始
while(i <= n - 2*s + 1)//正常情况,每一对儿都是两个长度为s 的子序列
{
Merge(a, b, i, i + s - 1, i + 2 * s - 1);
i = i + 2 * s;
}
if(i < n - s + 1)//将最后的两对儿合并,其中后面的一对儿长度小于s
{
Mer