c语言冒泡数组

来源:百度知道 编辑:UC知道 时间:2024/07/04 06:27:29
{ int i,j,t,a[10];
printf("Please input 10 numbers:\n");
for(i=0;i<10;i++) /*输入10个整数存入数组a中*/
scanf("%d",&a[i]);
for(i=0;i<9;i++) /*对数组a中的10个整数排序*/
for(j=0;j<9-i;j++)
if(a[j]>a[j+1]) /*前面的元素大于后面的元素则交换*/
{ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }
printf("The sorted numbers are:");
for(i=0;i<10;i++) /*输出数组a中的10个元素*/
printf("%d ",a[i]);
printf("\n");
}
这个问题的解决思路是从第一数开始将相邻的两个数比较,较大的数向后移动,较小的数向“上浮”一个,经过一轮的比较,最大的数移动到末尾。对剩下的数继续下一轮的比较和移动。如果n个数比较,这样n-1轮后,就完成了排序工作 请详细解释一下 for(i=0;i<9;i++) /*对数组a中的10个整数排序*/
for(j=0;j<9-i;j++)
if(a[j]>a[j+1]) 这个排序的过程,答非所问者没分。
for(i=0;i<9;i++)这句什么作用?for(j=0;j<9-i;j++)这句什么作用?重点解释一下j<9-i.

先从a[0]开始比较
用a[0]到a[9]比较
如果前项大于后项 就互换位置
这样能保证当前比较到的最大项是存储在当前比较到的最后一位上
这样最大值就存储到了a[9]
然后
i++

这样结束一个循环
比较一轮放一个最大值到后面的位置上
总体思路是
先把最大值放到最后
然后把最后项排除之后的最大值放到倒数第二个位置
以此类推

for(i=0;i<9;i++)这句什么作用
因为最坏情况下你需要冒泡9次才能排好序(逆序排列时)
这个循环的意思就是最大冒泡次数
之后就是用 a[0]到 a[9-i]比较
因为你比较过一次之后最后一项就已经是最大的了,不需要再和它比较,为了优化算法,减少步骤
每比较一次就少比较一项
所以是9-i

i=3的时候,最后3个数已经被排列好
所以不需要比较下标 7,8 ,9的最后3个数
只要比到下标6就OK