编译成功但刷题网站没通过{数组排列}

问题遇到的现象和发生背景
#include<stdio.h>
int a[100];
int main()
{
    int i,b,t,j;
 scanf("%d",&b);
 for(i=1;i<=b;i++)
 {
     scanf("%d",&a[i]);
 }
for (i=0;i<b;i++)
    for(j=0;j<b-i;j++)
        if(a[j]>a[j+1])
        {
            t=a[j+1];
            a[j+1]=a[j];
            a[j]=t;
        }
    for(i=1;i<=b;i++)
    printf("%d",a[i]);

return 0;
}


问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

你的代码有很多问题:

  1. 用于存储元素个数a[100]限制了元素最大个数,却没有做输入元素个数检查,有越界危险,不安全。既然有输入数组元素个数,建议使用动态数组(int *a = (int*)malloc(sizeof(int)*n););
  2. a[]的写入范围不是0..n-1,但是访问的时候却是a[0..],也就是a[0]未写先读;
  3. 冒泡排序只需要n-1趟排序,而你的i代表了排序趟数,值却为0..b-1,也就是b(n)趟排序,不正确;

冒泡排序?参见这段代码:

int* MySort(int* arr, int arrLen, int* returnSize ) {
    // write code here
    if (!arr || arrLen <= 1) return arr;
    
    for (int i = 0; i < arrLen - 1; i++) {
        for (int j = 1; j < arrLen - i; j++) {
            if (arr[j] < arr[j-1]) {
                int temp = arr[j-1];
                arr[j-1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    
    if (returnSize) *returnSize = arrLen;
    return arr;
}

地址:

备注:冒泡排序时间复杂度O(n*n),达不到题目要求的O(nlogn)

修改如下,供参考:

#include<stdio.h>
int a[100];
int main()
{
    int i,b,t,j;
    scanf("%d",&b);
    if(b<=0 || b>=100) b=10;   //修改
    for(i=0;i<b;i++) //for(i=1;i<=b;i++) 修改
    {
        scanf("%d",&a[i]);
    }
    for (i=0;i<b-1;i++){  //for (i=0;i<b;i++) 修改
        for(j=0;j<b-i-1;j++) //for(j=0;j<b-i;j++) 修改
            if(a[j]>a[j+1])
            {
               t=a[j+1];
               a[j+1]=a[j];
               a[j]=t;
            }
    }
    for(i=0;i<b;i++)  //for(i=1;i<=b;i++) 修改
        printf(" %d",a[i]);
    return 0;
}