数据结构暑期自学--MOOC浙江大学pta(7-14 Insertion or Heap Sort)

题目链接

前言:

该题与上面一题相似,都是判断为哪个排序算法

关键点:

与上题思路相同,列出每步排序的函数,再分别判断

插入排序就不说了

堆排序:

首先要将原数组建立成一个最大堆

这里利用每次插入作为根节点的方法来做

int PercDown(int X[], int p, int N)
{
	int Parent, Child, tmp;
	tmp = X[p];
	for (Parent=p; Parent*2+1<N; Parent=Child)
	{
		Child = Parent*2+1;
		if (Child+1<N&&X[Child]<X[Child+1])
		Child++;
		if (X[Child]<=tmp)
		break;
		X[Parent] = X[Child];
	}
	X[Parent] = tmp;
	return pan(X);
} 
	for (int i=n/2-1; i>=0; i--)
	PercDown(B, i, n);

然后再将最上面的X[0](最大值)与最后一个结点交换,再将剩下的数组再弄成一个最大堆,然后再次交换

完整代码:

# include <stdio.h>
# include <stdlib.h>
int n;
int A[110], B[110], ans[110];
void print(int X[])
{
	printf("%d", X[0]);
	for (int i=1; i<n; i++)
	printf(" %d", X[i]);
	printf("\n");
}
int pan(int X[])
{
	for (int i=0; i<n; i++)
	{
		if (ans[i]!=X[i])
		return 0;
	}
	return 1;
}
int InsertSort(int X[], int p)
{
	int tmp = X[p];
	int i;
	for (i=p; i>0&&X[i-1]>tmp; i--)
	X[i] = X[i-1];
	X[i] = tmp;
	return pan(X);
}
void Swap(int *a, int *b)
{
	int t;
	t = *a;
	*a = *b;
	*b = t;
}
int PercDown(int X[], int p, int N)
{
	int Parent, Child, tmp;
	tmp = X[p];
	for (Parent=p; Parent*2+1<N; Parent=Child)
	{
		Child = Parent*2+1;
		if (Child+1<N&&X[Child]<X[Child+1])
		Child++;
		if (X[Child]<=tmp)
		break;
		X[Parent] = X[Child];
	}
	X[Parent] = tmp;
	return pan(X);
} 
int main()
{
	scanf("%d", &n);
	for (int i=0; i<n; i++)
	{
		scanf("%d", &A[i]);
		B[i] = A[i];
	}
	for (int i=0; i<n; i++)
	scanf("%d", &ans[i]);
	for (int i=n/2-1; i>=0; i--)
	PercDown(B, i, n);
	int flag = 0;
	int i = 1, j = n-1;
	while (1)
	{
		flag = InsertSort(A, i);
		i++;
		if (flag)
		{
			InsertSort(A, i);
			printf("Insertion Sort\n");
			print(A);
			break;
		}
		Swap(&B[0], &B[j]); 
		flag = PercDown(B, 0, j);
		j--;
		if (flag)
		{
			Swap(&B[0], &B[j]); 
			PercDown(B, 0, j);
			printf("Heap Sort\n");
			print(B);
			break;
		}
	}
	
	
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值