歸併排序

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章