#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;
}
}
你的疑惑应该在最下面那个排序那里。
在最后的双层for循环中,外层for循环遍历数组,内层for循环用来判断 j 位置之前的数据是否比a[j]小,
如果a[j]之前的某个数据比a[j]小,那么就把a[j]插入到a[i]数据的后面。
如果 j 之前的都比a[j]大,就把a[j]放在最前面,
也就是保证数据从小到大排列。
完整代码:
#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]);
}
}
}
哪里代码不理解?
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!