蓝桥杯基础练习及错误分析——数列排序

问题描述
  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
  第一行为一个整数n。
  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
  输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9
标准例程

#include <stdio.h>
#include <stdlib.h>
void Print(int *data,int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d ",data[i]);
	}
	printf("\n");
}

int Split(int *data,int pre,int rear)
{
	int value=data[pre];
	while(pre<rear)
	{
		while(data[rear]>=value && pre<rear) rear--;
		data[pre]=data[rear];
		while(data[pre]<value && pre<rear) pre++;
		data[rear]=data[pre];
	}
	data[pre]=value;
	return pre;
}

//快速排序
void QuickSort(int *data,int pre,int rear)
{
	if(pre<rear)
	{
		int mid=Split(data,pre,rear);
		QuickSort(data,pre,mid-1);
		QuickSort(data,mid+1,rear);
	}
}

int main()
{
	int i;
	int n;
	int *data;
	scanf("%d",&n);
	data=(int *)malloc(sizeof(int)*n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&data[i]);
	}
	QuickSort(data,0,n-1);
	Print(data,n);
	return 0;
}
我所写的代码:


#include <stdio.h>
 
int main()
{
	int n,i,j,temp;
	int a[200];
	scanf("%d",&n);
	if(n==0)
	return 0;
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		if (a[i]>10000)
		return 0;
	}
	
	for(i=0;i<n-1;i++)
		{
			for (j=0;j<n-i-1;j++)
			{
				
				if(a[j]>a[j+1])
				{
					temp=a[j+1];
					a[j+1]=a[j];
					a[j]=temp;
				}
			}
	}
	for(i=0;i<n;i++)
	{
		printf("%d",a[i]);
		if(i<n-1)
		printf("\040");
	}
	printf("\n");
	return 0;
}
注意:


1、在写代码时,一定要注意输出的格式,我认为本题中的描述不够清晰,因为它并没有在描述中给出结果输出时是   
   需要每个数之间都需要一个空格的。我在蓝桥杯的练习系统中尝试了无数次都没能发现这个问题,还是请教了大 
   佬学长之后才意识到要加空格,且空格只在两个数之间,最后一个数是没有空格的!
2、在写排序代码的那一段时,尤其要注意的是:j<n-i-1.我当时写的是:j<n-i.我当时以为这个是没有问题的,    
  但是在下面的a[j]和a[j+1]中会发现,j的最大值是不一样的,前者的最大值是n-i-2,而后者是n-i-1.那么 
  j+1就分别为n-i-1和n-i,其中会发现n-i发生了数组(a[0]~a[n-1-i])的“越界”!其中,错误是发生在第一次排 
  序中的(i=0时),观察我下面的结果:

                                4
                                3 4 5 6666666
                                3 4 5 1577904
    不难发现,数组是越界的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值