1098. Insertion or Heap Sort (25)

#include <iostream>
#include <algorithm>

using namespace std;

int ori[110], cur[110];

void adjustdown(int k, int max)
{
	ori[0] = ori[k];

	int i;
	for(i = k * 2; i <= max; i *= 2)
	{
		if(i + 1 <= max && ori[i + 1] > ori[i])
		{
			i++;
		}

		if(ori[i] < ori[0])
		{
			break;
		}

		ori[k] = ori[i];
		k = i;
	}

	ori[k] = ori[0];
}

void buildheap(int n)
{
	int i;
	for(i = n / 2; i >= 1; i--)
	{
		adjustdown(i, n);
	}
}

int judge(int n)
{
	int i;
	for(i = 1; i <= n; i++)
	{
		if(ori[i] != cur[i])
		{
			return 0;
		}
	}

	return 1;
}

void heapsort(int n)
{
	buildheap(n);

	int i, flag, temp;
	for(i = n; i >= 2; i--)
	{
		flag = judge(n);

		temp = ori[1];
		ori[1] = ori[i];
		ori[i] = temp;

		adjustdown(1, i - 1);

		if(flag == 1)
		{
			break;
		}
	}
}

int main()
{
	int n;
	scanf("%d", &n);

	int i;
	for(i = 1; i <= n; i++)
	{
		scanf("%d", &ori[i]);
	}

	for(i = 1; i <= n; i++)
	{
		scanf("%d", &cur[i]);
	}

	for(i = 2; i <= n; i++)
	{
		if(cur[i - 1] > cur[i])
		{
			break;
		}
	}

	int j;
	for(j = i; j <= n; j++)
	{
		if(ori[j] != cur[j])
		{
			break;
		}
	}

	if(j == n + 1)
	{
		printf("Insertion Sort\n");
		sort(ori + 1, ori + i + 1);
	}
	else
	{
		printf("Heap Sort\n");
		heapsort(n);
	}

	for(i = 1; i <= n; i++)
	{
		if(i > 1)
		{
			printf(" ");
		}

		printf("%d", ori[i]);
	}

	printf("\n");

	system("pause");
	return 0;
}

 

posted on 2025-11-23 17:24  王景迁  阅读(4)  评论(0)    收藏  举报

导航