C语言:随机生成100以内的数,并用冒泡排序,这个哪里错了?

从0开始学C,纯小白一个
代码如下,编译后,有时候能排序,有时候又不能排序,这是怎么回事?
图片说明图片说明

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

#define MAXSIZE 255


/*冒泡排序*/
void BubbleSort(int a[],int n){
    int i,j,temp;
    int flag=0;
    for(i=1;i<n;i++){
        for(j=1;j<n-i+1;j++){
            if(a[j]>a[j+1]){
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
                flag=1;
            }
        if(flag==0) return;
        }
    }
}

 int main(){
    srand(time(NULL));  //生成10个100以内的数
    int length=10;
    int i,J;
    int k=1;
    int a[MAXSIZE];
    for(i=1;i<=length;i++){ 
        a[i]=rand()%101;
    }
    printf("排序前:");
    for (i=1;i<=length;i++){
        printf("%d\t",a[i]);
    }
    putchar('\n'); 
    printf("排序后:");
    BubbleSort(a,length);       //冒泡排序
    for (i=1;i<=length;i++){
        printf("%d\t",a[i]);
    }
    putchar('\n'); 
    return 0;   
 }

数组操作应该从0开始操作,起泡排序第二层应该减1,请养成良好编程习惯:

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

#define MAXSIZE 255


/*冒泡排序*/
void BubbleSort(int a[],int n)
{
    int i,j,temp;
    for(i=0;i<n-1;i++)
    {
        for(j=0;j<n-1-i;j++)
        {
            if(a[j]>a[j+1])
            { 
                temp =a[j+1];
                a[j+1] = a[j];
                a[j] = temp;
            }
        }
    }
}

int main()
{
    int length=10;
    int i;
    int k=1;
    int a[MAXSIZE];
    srand(time(NULL));  //生成10个100以内的数
    for(i=0;i<length;i++){ 
        a[i]=rand()%101;
    }
    printf("排序前:");
    for (i=0;i<length;i++){
        printf("%d ",a[i]);
    }
    putchar('\n'); 
    printf("排序后:");
    BubbleSort(a,length);       //冒泡排序
    for (i=0;i<length;i++){
        printf("%d ",a[i]);
    }
    putchar('\n'); 
    return 0;   
}