归并排序(非递归)

456 阅读2分钟
#include<iostream>
void Merge(int SR[], int TR[], int i, int m, int n);
void MergePass(int SR[], int TR[], int k, int n);

typedef struct
{
	int length = 17;
	int r[18];// = { 0,50,10,90,30,70,40,80,60,20 };

}Sqlist;

void Mergesort2(Sqlist* L)
{
	int* TR = new int[L->length+1];
	int k = 1;
	while (k < L->length)
	{

		MergePass(L->r,TR,k,L->length);
		k = k * 2;
		MergePass(TR,L->r,k,L->length);
		k = k * 2;

	}
	

}

void MergePass(int SR[], int TR[], int k, int n)
{
	int i = 1;
	int j;
	while (i <= n - 2 * k + 1) // 这个条件  2*k+1 是保证 还能有两个 序列用来归并 
	{
		Merge(SR, TR, i, i + k - 1, i + 2 * k - 1); //两两归并 
		i = 2 * k + i;
	}

	if (i < n - k + 1)
		Merge(SR, TR, i, i + k - 1, n);
	else
		for (j = i;j <= n; j++)
			TR[j] = SR[j];
}

void Merge(int SR[], int TR[], int i, int m, int n)
{
	int j, k, l;
	for (j = m + 1, k = i;j <= n && i <= m; k++)
	{
		if (SR[i] < SR[j])
			TR[k] = SR[i++];
		else
			TR[k] = SR[j++];

	}
	if (i <= m)
	{
		for (l = 0; l <= m - i;l++)
			TR[k + l] = SR[i + l];
	}
	if (j <= n)
	{
		for (l = 0; l <= n - j;l++)
			TR[k + l] = SR[j + l];
	}
    

}

int main()
{
	int a[10] = {0,50,10,90,30,70,40,80,60,20 };
	Sqlist* l = new Sqlist;
	l->r[0] = 0;
	l->r[1] = 50;
	l->r[2] = 10;
	l->r[3] = 90;
	l->r[4] = 30;
	l->r[5] = 70;
	l->r[6] = 40;
	l->r[7] = 80;
	l->r[8] = 60;
	l->r[9] = 20;
	l->r[10] = 5;
	l->r[12] = 1;
	l->r[13] = 9;
	l->r[14] = 3;
	l->r[15] = 7;
	l->r[16] = 4;
	l->r[17] = 8;
	l->r[11] = 2;
	
	
	//for (int i = 1;i < 18;i++)
	//std::cout << l->r[i] << std::endl;
	//l->r = a ;

	Mergesort2(l);
	for(int i =1;i<18;i++)
	std::cout << l->r[i] << std::endl;
	//delete  l;
}