歸併排序算法在遇到大量的數據進行排序時,如讀取磁盤裏的大量文件數據進行排序,而一次排序又無法開闢那麼大的內存空間給排序的數據時,那麼歸併排序就是一個很好的選擇。而在嵌入式程序設計中儘量不要使用遞歸,因爲遞歸是多重的函數嵌套調用,需要很大的棧資源。因此,收集了一下非遞歸的歸併排序算法,並通過輸入一個二維數組案例(行數爲測試的數組例子個數,列數爲排序的數組的元素個數)去驗證是可行,從而又引出關於二重指針的數組動態數組分配問題,參考了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;
}