归并排序过程模拟

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

    具体的操作方法为对其不断地分割为两半并对两半进行排序,最后统一进行排序。因此,可以使用递归对不断的分割排序。

        自己手动模拟了整个过程,尚需优化。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<string>
using namespace std;

const int MAXN = 10005;

int num[MAXN];
int flag[MAXN];

void P(int l, int r)
{
	if(l == r)
		return ;
	int m = (l + r) / 2;
	P(l, m);
	P(m + 1, r);
	int a = l;
	int b = m + 1;
	int k = l;
	while(a <= m && b <= r)
	{
		if(num[a] < num[b])
			flag[k++] = num[a++];
		else if(num[a] > num[b])
			flag[k++] = num[b++];
		else if(num[a] == num[b])
		{
			flag[k++] = num[a++];
			flag[k++] = num[b++];
		}
	}
	if(b == r + 1)
		for(int i = a; i <= m; i++)
			flag[k++] = num[i];
	else if(a == m + 1)
		for(int i = b; i <= r; i++)
			flag[k++] = num[i];
	for(int i = l; i <= r; i++)
		num[i] = flag[i];
}

int main()
{
	int n;
	while(~scanf("%d", &n))
	{
		memset(num, 0, sizeof(num));
		memset(flag, 0, sizeof(flag));
		for(int i = 1; i <= n; i++)
			scanf("%d", &num[i]);
		P(1, n);
		for(int i = 1; i <= n; i++)
			printf("%d||", num[i]);
		cout << endl;
	}
	return 0;
}

在对比网上的代码后, 终于完成了归并排序,上代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

const int MAXN = 10005;

int num[MAXN];
int flag[MAXN];

void P(int l, int r)
{
	if(l == r)
		return ;
	int m = (l + r) / 2;
	P(l, m);
	P(m + 1, r);
	int a = l;
	int b = m + 1;
	int k = l;
	while(a <= m && b <= r)
	{
		if(num[a] < num[b])
			flag[k++] = num[a++];
		else if(num[a] > num[b])
			flag[k++] = num[b++];
		else if(num[a] == num[b])
		{
			flag[k++] = num[a++];
			flag[k++] = num[b++];
		}
	}
	while(a <= m)
		flag[k++] = num[a++];
	while(b <= r)
		flag[k++] = num[b++];
	for(int i = l; i <= r; i++)
		num[i] = flag[i];
}

int main()
{
	int n;
	while(~scanf("%d", &n))
	{
		memset(num, 0, sizeof(num));
		memset(flag, 0, sizeof(flag));
		for(int i = 1; i <= n; i++)
			scanf("%D", &num[i]);
		P(1, 10);
		for(int i = 1; i <= n; i++)
			printf("%d ", num[i]);
		printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/someone_and_anyone/article/details/80940446
今日推荐