C语言冒泡排序法的疑惑

任意输入n个数,冒泡排序。我写的代码是这样的:

int main()
{
    int i,j,t,n;
    int a[n];
    n=5;
    printf("Please Enter %d numbers: \n",n);
    for(i=0;i<n;i++) {
        scanf("%d",&a[i]);
    }
    printf("The original order is: \n");
    for(i=0;i<n;i++) {
        printf("%5d",a[i]);
    }
    printf("\n");
    for(i=0;i<n-1;i++) {
        for(j=0;j<n-1-i;j++) {
            if(a[j]>a[j+1]) {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    printf("The sorted order is: \n");
    for(i=0;i<n;i++) {
        printf("%5d",a[i]);
    }
    printf("\n");
    return 0;
}

编译时没有问题,执行时就会说“程序已停止工作”之类的,我后来又把数组声明的"int a[n]"改成"int a[n+1]",就正常了,为什么啊?我里面明明只放了n个数,为什么要声明一个n+1个元素的数组?

通过实际测试你的程序有两个问题,一个n=5;应该在数组定义前面;一个冒泡排序两个for语句的第一个,应该是for(i=0;i<n;i++)

//冒泡的思想(按升序),两个相邻的数进行比较,第一个和第二个比较, 如果第一个比第二个大,就交换顺序,否则不交换。接下来再比较第二个和第三个,仍
//然是如果前者比后者大,就交换顺序。这样依次比较,这样当倒数第二个数和最后一个数比较过后,最后一个数就是这些数里最大的,上述过程称作第一趟冒泡排序。
//按这样的比较规则再比较最后一个数前面的所有数,就能找出倒数第二大的数来。判别排序结束的条件是......
答案就在这里:C语言 冒泡排序法
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

冒泡算法?好久没玩了

任意输入n个数,需要动态分配数组:

 #include "stdio.h"
int main()
{
    int i,j,t,n;
    //int a[n];
    //n=5;
    int *a;
    printf("请输入数组长度:");
    scanf("%d",&n);
    a=new int[n]; //增加
    printf("Please Enter %d numbers: \n",n);
    for(i=0;i<n;i++) {
        scanf("%d",&a[i]);
    }
    printf("The original order is: \n");
    for(i=0;i<n;i++) {
        printf("%5d",a[i]);
    }
    printf("\n");
    for(i=0;i<n-1;i++) {
        for(j=i;j<n-1;j++) {//修改
            if(a[j]>a[j+1]) {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    printf("The sorted order is: \n");
    for(i=0;i<n;i++) {
        printf("%5d",a[i]);
    }
    printf("\n");
    delete []a;//增加
    return 0;
}