关于冒泡排序内循环的问题?

include

void sort(int * a, int len)
{
int i, j, t;

for (i=0; i<len-1; ++i)
{
    for (j=0; j<len-1-i; ++j)
    {
        if (a[j] > a[j+1])  // >表示升序 <表示降序
        {
            t = a[j];
            a[j] = a[j+1];
            a[j+1] = t; 
        }
    }
}

}

int main(void)
{
int a[6] = {10, 2, 8, -8, 11, 0};
int i = 0;

sort(a, 6);

for (i=0; i<6; ++i)
{
    printf("%d ", a[i]);
}
printf("\n");

return 0;

}

看不懂for的内层循环,为什么要用j<len-1-i,看了下输出结果,发现,没有-1的话,那么结果会变成-8 0 1 2 8 10,就不是程序要的-8 0 2 8 10 11了,看定义是说内层循环时算每i趟排序次数,而这个次数是(N-i)趟,外层是看明白,就是整不明白内层为什么要-1??刚学不懂这些,麻烦诸位解答一二!多谢!

当i=0的时候,数组范围是0~len-1,那么if (a[j] > a[j+1]) 为了保证a[j+1]不越界,此时j必须<=len-0-2
所以j<=len-i-2或者j<len-i-1