动态调试,记录j的每一次循环后数组的变化,为什么

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

main(){
int i,j,t,a[10];
printf("输入三个数:\n"); scanf("%d",&a[0]);

for (i=1;i<=9;i++){
srand((unsigned int)time(NULL));
a[i]=rand() % (200-i);
}

printf(" source data: ");  for (i=0;i<=9;i++) printf("%d ,",a[i]); printf(" \n");

for (j=1;j<=9;j++) { //动态调试,记录j的每一次循环后数组的变化,为什么
t=a[j];
for (i=j-1;i>=0;i--)
if ( a[i] < t ) break;
else a[i+1]=a[i];
a[i+1]=t;
}
}

img


116,63,73,83,93,103,113,123,133,143
116,155,69,182,99,18,133,55,171,96
116,15,129,46,161,81,3,120,45,163
116,130,47,163,83,5,123,48,167,95

你的疑惑应该在最下面那个排序那里。
在最后的双层for循环中,外层for循环遍历数组,内层for循环用来判断 j 位置之前的数据是否比a[j]小,
如果a[j]之前的某个数据比a[j]小,那么就把a[j]插入到a[i]数据的后面。
如果 j 之前的都比a[j]大,就把a[j]放在最前面,

也就是保证数据从小到大排列。

img

完整代码:

#include <time.h>
#include <stdlib.h>
#include <stdio.h>
int main() {
    int i, j, t, a[10];
    int k;
    srand((unsigned int)time(NULL)); //srand调用1次即可,不需要在for循环中重复调用
    printf("输入三个数:\n"); 
    scanf("%d", &a[0]); //这里只输入了1个数???

    //随机生成9个数
    for (i = 1; i <= 9; i++) {
        
        a[i] = rand() % (200 - i);
    }

    printf(" source data: ");  
    for (i = 0; i <= 9; i++) 
        printf("%d ,", a[i]); printf(" \n");
    for (j = 1; j <= 9; j++) { //动态调试,记录j的每一次循环后数组的变化,为什么
        t = a[j]; //记录j位置的数值
        for (i = j - 1; i >= 0; i--) //这个for循环查找0到j-1位置上,比a[j]这个值小的数
            if (a[i] < t) //如果比a[i] 比a[j]小,就把大数放在a[i]的后面,也就是从小到大排序
                break;
            else 
                a[i + 1] = a[i];
        a[i + 1] = t;

        //输出
        for (k = 0; k < 10; k++)
        {
            if (k < 9)
                printf("%d,", a[k]);
            else
                printf("%d\n", a[k]);
        }
    }
}

哪里代码不理解?

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632