归并排序算法在遇到大量的数据进行排序时,如读取磁盘里的大量文件数据进行排序,而一次排序又无法开辟那么大的内存空间给排序的数据时,那么归并排序就是一个很好的选择。而在嵌入式程序设计中尽量不要使用递归,因为递归是多重的函数嵌套调用,需要很大的栈资源。因此,收集了一下非递归的归并排序算法,并通过输入一个二维数组案例(行数为测试的数组例子个数,列数为排序的数组的元素个数)去验证是可行,从而又引出关于二重指针的数组动态数组分配问题,参考了https://blog.csdn.net/lizhenqi19890218/article/details/84624376。
//归并排序
void Merge(int A[], int TmpA[], int L, int R, int RightEnd)
{
int LeftEnd, NumElements, Tmp;
int i;
LeftEnd = R-1;
Tmp = L;
NumElements = RightEnd - L + 1;
while (L <= LeftEnd&&R <= RightEnd)
{
if (A[L] <= A[R])
TmpA[Tmp++] = A[L++];
else
TmpA[Tmp++] = A[R++];
}
while (L <= LeftEnd)
TmpA[Tmp++] = A[L++];
while (R <= RightEnd)
TmpA[Tmp++] = A[R++];
for (i = 0; i < NumElements; i++, RightEnd--)
{
A[RightEnd] = TmpA[RightEnd];
}
}
void Merge_pass(int A[], int TmpA[], int N, int length)
{
int i, j;
for (i = 0; i <= N - 2 * length; i += 2 * length)
Merge(A, TmpA, i, i + length, i + 2 * length - 1);
if (i + length < N)//判断是否超过一个子序列
Merge(A,TmpA,i,i+length,N-1);
else
{
for (j = i; j < N;j ++)
TmpA[j] = A[j];
}
for (i = 0; i < N; i++)
{
A[i] = TmpA[i];
}
}
void Merge_Sort(int a[], int n)
{
int *tmp;
int step = 1;
tmp = (int *)malloc(sizeof(int)*n);
if (tmp != NULL)
{
while (step < n)
{
Merge_pass(a,tmp,n,step);
step *= 2;
Merge_pass(tmp,a,n,step);
step *= 2;
}
}
}
//二重指针动态分配 参考一下链接
//https://blog.csdn.net/lizhenqi19890218/article/details/84624376
int main(void)
{
int col, row;
int **in_a=NULL;
//int *ina1;
cin >> row>>col;
in_a = new int* [row];
in_a[0] = new int[row*col];//一次性分配所有空间
//in_a = (int **)malloc(sizeof(int *)*row);
//in_a[0] = (int *)malloc(sizeof(int )*col*row);
for (int i = 1; i < row; i++)
in_a[i] = in_a[i - 1] + col;//分配每个指针指向的数组
for (int i = 0; i < row; i++)
{
//in_a[i]=new int [col]; //分配每个指针指向的数组
//in_a[i] = (int *)malloc(sizeof(int)*col);
for (int j = 0; j < col; j++)
cin >> in_a[i][j];
}
for (int j = 0; j < row;j++)
{
int n;
int *a=new int[col];
//n = sizeof(a3) / sizeof(a3[0]);
n = col;
for (int i = 0; i < col; i++)
{
a[i] = in_a[j][i];
}
Merge_Sort(a, n);
for (int i = 0; i < n; i++)
printf("%d ", a[i]);
printf("\n");
}
system("pause");
return 0;
}