问题描述
给定一个长度为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
不难发现,数组是越界的