第1个回答 2017-12-16
数组排序前 7 23 12 4 33 21 2 17 13 9
第一轮排序 7 12 4 23 21 2 17 13 9 33
第二轮排序 7 4 12 21 2 17 13 9 23
第三轮排序 4 7 12 2 17 13 9 21
第四轮排序 4 7 2 12 13 9 17
第五轮排序 4 2 7 12 9 13
第六轮排序 2 4 7 9 12
第七轮排序 2 4 7 9
第八轮排序 2 4 7
第九轮排序 2 4
可以看到,每一轮的排序,在这一轮中参与比较的元素中最大的数将会浮到最后。而冒泡排序的名字也是从这里来的 。
数组排序前 7 23 12 4 33 21 2 17 13 9
第一轮循环 2 23 12 4 33 21 7 17 13 9
第二轮循环 4 12 23 33 21 7 17 13 9
第三轮循环 7 23 33 21 12 17 13 9
第四轮循环 9 33 21 12 17 13 23
第五轮循环 12 21 33 17 13 23
第六轮循环 13 33 17 21 23
第七轮循环 17 33 21 23
第八轮循环 21 33 22
第九轮循环 22 33
通过这个过程,我们可以看到,每轮循环过程中,都会找出这个最值元素,下一轮排序时就不用再考虑这个元素
第2个回答 2011-06-16
先上选择法和冒泡法:
1.选择法
#include<stdio.h>
void main()
{
int i,j,min,temp;
int a[10];
printf("请输入十个整数:");
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
min=i;
for(j=i+1;j<=9;j++)
{
if(a[min]>a[j])
{
min=j;
}
temp=a[j];
a[j]=a[min];
a[min]=temp;
}
}
for(i=0;i<=9;i++)
printf("%4d",a[i]);
}
2.冒泡法
#include<stdio.h>
void main()
{
int i,j,temp;
int a[10];
printf("请输入十个整数:");
for(i=0;i<=9;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
for(j=9;j>i;j--)
{
if(a[j]<a[j-1])
{
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}/*
for(j=0;j<9-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}大的气泡往下沉,小的气泡往上浮!!!注意:是a[j-1]还是a[j+1];
深刻了解!!!
*/
for(i=9;i>=0;i--)
printf("%4d",a[i]);
}
通过这两个程序,可以发现他们的编程还是有些区别的,但是总结下:
相同点:
1.都要通过n-1组排出具有n个数的顺序;
2.都是通过逐个相比,比出最值的;
。。。
不同点:
1.冒泡法,顾名思义就是把小的泡冒到上面,大的泡沉到下面,最值在中间和其他的值交换;
而选择法,是假定了一个最值,所以最值和其他的值的交换就发生在假定最值的地方;
。。。
其实冒泡法和选择法的区别不大,都是效率比较低的方法。本回答被提问者采纳
第3个回答 2011-06-16
#include<stdio.h> //链接标准头文件
#define N 5 //定义常量N并赋值为5
void main() //主函数入口
{ //表示主函数开始
int i,j; //定义整形变量i和j
int grade[N],temp; //定义N维(N=5,也就是五维啦^^)整形数组和整形变量temp
printf("输入5个数\n"); //在屏幕上显式“输入5个数”并且换行
for(i=0;i<N;i++) //开始for循环,从i=0,每次加1,直到i=4,共需循环5次
{ //循环体开始
scanf("%d",&grade[i]); //依次获取用户输入的整数值并存入数组grade中
} //循环结束
for(i=0;i<N;i++) //开始外层for循环,从i=0,每次加1,直到i=4
{ //外层循环体开始
for(j=0;j<N-1-i;j++) //开始外层for循环,从j=0,每次加1直到i等于外层循环的N-j-1
{ //内层循环体开始
if(grade[j]<grade[j+1]) //条件判断
{ //如果整形数组前面的数比其后的小,执行以下语句
temp=grade[j+1]; //将比较大的数赋值给temp
grade[j+1]=grade[j]; //将比较小的数赋值给数组中后面的变量
grade[j]=temp; //将比较大的数赋值给数组中前面的变量
} //从此便完成大小变量的交换,使得大值往前放
} //结束内层循环
} //结外内层循环,完成排序
printf("最后排序为:\n");//在屏幕显式“最后排序为:”并换行
for(i=0;i<N;i++) //同开始的for循环类似
{ //开始循环输出
printf("%d",grade[i]); //只是这里要逐个输出数组中的五个数值
} //结束循环输出
printf("\n"); //输出换行到屏幕,看不到什么效果,可删掉
} //结束main()函数