“第四十二天”

文章讨论了C语言中使用指针对数组进行排序时遇到的问题,指出由于指针可能改变原始数组元素的位置,导致在比较和更新过程中出现错误。作者提供了两种解决方案,一种是使用结构体并重新组织数据,另一种是通过交换整个结构体来保持正确性。
摘要由CSDN通过智能技术生成

 

这个,之前用的b去存储a的总和和排名,后来在比较的过程中,只改变的b的值,却没有改变a的值,但在比较语文成绩的时候用的还是a,这个时候a和b同样是第i个对应的可能不是同一个对象了

,因为上面b的值可能改变了,现在的第i个b可能是原来第i+1,i-1个,都有可能,所以比较结果错误。

#include<stdio.h>
#include<stdlib.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	int(*a)[3] = (int*)malloc(sizeof(int) * 3 * n);
	int i = 0;
	int(*b)[2] = (int*)malloc(sizeof(int) * 2*n);
	for (i = 0; i < n; i++)
	{
		scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
		b[i][0] = a[i][0] + a[i][1] + a[i][2];
		b[i][1] = i+1;
	}
	for (i = 0; i < n; i++)
	{
		int max = 0;
		int c = 0;
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (b[j][0] < b[j + 1][0])
			{
				max = b[j + 1][0];
				b[j + 1][0] = b[j][0];
				b[j][0] = max;
				c = b[j + 1][1];
				b[j + 1][1] = b[j][1];
				b[j][1] = c;
			}
			else if(b[j][0] == b[j + 1][0])
			{
				if (a[j][0] < a[j + 1][0])
				{
					c = b[j + 1][1];
					b[j + 1][1] = b[j][1];
					b[j][1] = c;
				}
				else if(a[j][0] == a[j + 1][0])
					if (b[j + 1][1] < b[j][1])
					{
						c = b[j + 1][1];
						b[j + 1][1] = b[j][1];
						b[j][1] = c;
					}
			}
		}
	}
	for (i = 0; i < 5; i++)
	{
		printf("%d %d\n", b[i][1], b[i][0]);
	}
	free(a);
	a = NULL;
	free(b);
	b = NULL;
	return 0;
}

 这个是正确的,不过感觉这样还是很麻烦

#include<stdio.h>
#include<stdlib.h>
struct Stu
{
	int g[3];
	int sum;
	int n;
};
int main()
{
	int n = 0;
	scanf("%d", &n);
	struct Stu* a = (struct Stu*)malloc(sizeof(struct Stu) * n);
	struct Stu r;
	int i = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d %d %d", &a[i].g[0], &a[i].g[1], &a[i].g[2]);
		a[i].sum = a[i].g[0] + a[i].g[1] + a[i].g[2];
		a[i].n=i+1;
	}
	for (i = 0; i < n; i++)
	{
		int max = 0;
		int c = 0;
		for (int j = 0; j < n - 1 - i; j++)
		{
			if (a[j].sum < a[j+1].sum)
			{
				r = a[j];
				a[j] = a[j + 1];
				a[j + 1] = r;
			}
			else if(a[j].sum == a[j + 1].sum)
			{
				if (a[j].g[0] < a[j + 1].g[0])
				{
					r = a[j];
					a[j] = a[j + 1];
					a[j + 1] = r;
				}
				else if(a[j].g[0] == a[j + 1].g[0])
					if (a[j].n>a[j+1].n)
					{
						r = a[j];
						a[j] = a[j + 1];
						a[j + 1] = r;
					}
			}
		}
	}
	for (i = 0; i < 5; i++)
	{
		printf("%d %d\n", a[i].n,a[i].sum);
	}
	free(a);
	a = NULL;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值