归并排序

归并排序算法在遇到大量的数据进行排序时,如读取磁盘里的大量文件数据进行排序,而一次排序又无法开辟那么大的内存空间给排序的数据时,那么归并排序就是一个很好的选择。而在嵌入式程序设计中尽量不要使用递归,因为递归是多重的函数嵌套调用,需要很大的栈资源。因此,收集了一下非递归的归并排序算法,并通过输入一个二维数组案例(行数为测试的数组例子个数,列数为排序的数组的元素个数)去验证是可行,从而又引出关于二重指针的数组动态数组分配问题,参考了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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值