c语言学生学号和成绩排序问题求解释原理

能不能解释一下这个代码排序的原理

{
int ranking[n][2];
for (int i = 0; i < n; i++)
{
ranking[i][0]=score[i][0];
ranking[i][1]=score[i][1];
}
if (m==3)
{
int j=1;
while (j)
{
j=0;
for (int i = 0; i < n-1; i++)
{
if (ranking[i][1]<ranking[i+1][1])
{
int t=ranking[i][1],s=ranking[i][0];
ranking[i][1]=ranking[i+1][1];
ranking[i][0]=ranking[i+1][0];
ranking[i+1][1]=t;
ranking[i+1][0]=s;
j++;
}
}
}
for (int i = 0; i < n; i++)
{
printf("No.%d: %02d %d\n",i+1,ranking[i][0],ranking[i][1]);
}

}
else
{
    int j=1;
    while (j)
    {
        j=0;
        for (int i = 0; i < n-1; i++)
        {
            if (ranking[i][1]>ranking[i+1][1])
            {
                int t=ranking[i][1],s=ranking[i][0];
                ranking[i][1]=ranking[i+1][1];
                ranking[i][0]=ranking[i+1][0];
                ranking[i+1][1]=t;
                ranking[i+1][0]=s;
                j++;
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        printf("No.%d: %02d %d\n",n-i,ranking[i][0],ranking[i][1]);
    }
}

}

我想要达到的结果

中间一大块就是数组元素的交换,主要的技巧就是while(j)循环。每次循环都将整个数组从头到尾比较一遍,如果有需要交换的元素,那么j就加1,使得j不为0,循环继续。如果没有元素交换,表明排序结束,这时由于while开头部分把j设置为0,使得while循环结束