15数组(冒泡排序)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

相邻两数,进行比较,发现逆序交换
大数沉淀,小数起泡
for(i=0;i<5;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; } a[0] a[1]
a[2]
a[3]
a[4]
a[5]
9 8 5 4 2 0
8 9
8 5 9 4 2 0
8 5
8 5
8 5
for(j= 0 ;j< 5 ;j++) for(i= j+1 ;i< 6 ;i++) if (a[j]>a[i]) { ……}
for(j= 0 ;j< n-1 ;j++) for(i= j+1 ;i< n ;i++) if (a[j]>a[i]) { ……}
……
for(i=5;i<6;i++) if (a[4]>a[i]) { t=a[3];a[3]=a[i];a[i]=t; }
《C语言程序设计》
冒泡排序
学习目标
熟练使用for循环,实现对数组元素元素的引用
掌握冒泡排序算法
为什么要进行排序
5
3
8
0
17
6
6
在n个元素的数组中查找一个指定的数时,可能要经过n次比 较,效率低。
最坏情况:比较log2n次
0
3
5
6
8
17
6
排序以后,可以提高查找效率!
如何实现排序?
例:有6个整数序列,要求按照从小到大的顺序对数列进行排序。 解题思路: 使用一维数组存储6个整数 采用冒泡法排序
0 9 8 5 4 2
0 8
0 5 9 8 4 2
0 4
0 2
9
5
9
8
9
8
4
2
5
2
5
4
for(i=3;i<6;i++) if (a[2]>a[i]) { t=a[2];a[2]=a[i];a[i]=t; }
a[0] a[1]
a[2]
a[3]
a[4]
a[5]
0 2 9 8 5 4
0 2
0 2 5 9 8 4
5
4
4
9
4
2
4
2
2
0
2
0
9
0
0
9
for(i=0;i<4;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }
a[0]
a[1]
8
5
8
5
4
5
4
5
4
5
4
a[2]
a[3]
4
2
8
2
2
8
2
0
2
0
a[4]
a[5]
0
9பைடு நூலகம்
0
9
0
9
8
9
9
for(i=0;i<3;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; } a[0] a[1] a[2] a[3] a[4] a[5] 5 4 4 4
课后思考
还有其他效率更高的排序方法吗?
0 2
8
9
4
9
5
4
8
5
for(i=4;i<6;i++) if (a[3]>a[i]) { t=a[3];a[3]=a[i];a[i]=t; }
a[0] a[1]
a[2]
a[3]
a[4]
a[5]
0 2 4 9 8 5
0 2
0 2 4 5 9 8
4
8
9
5
for(i=5;i<6;i++) if (a[4]>a[i]) { t=a[3];a[3]=a[i];a[i]=t; }
a[0] a[1]
a[2]
a[3]
a[4]
a[5]
0 2 4 5 9 8
0 2
4
5
8
9
for(i=1;i<6;i++) if (a[0]>a[i]) { t=a[0];a[0]=a[i];a[i]=t; }
for(i=2;i<6;i++) if (a[1]>a[i]) { t=a[1];a[1]=a[i];a[i]=t; }
4
2
5
2
2
5
2
0
0
8
0
8
0
8
5
8
9
9
9
9
for(i=0;i<2;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }
a[0]
a[1]
4
2
2
4
2
0
a[2]
a[3]
0
5
0
5
4
5
a[4]
a[5]
8
9
8
9
8
9
for(i=0;i<1;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; } a[0] 2 0
a[i]与a[i+1]交 换
N
10 个数给a[0]到a[5] 输出10 [9]

如果是n个数呢?
[n-1] 输入 6n 个数给a[0]到a[5] j由0变到 n-2 4 ,共执行 n-1 5 次循环 进行 n-1-j 5-j 次比较 a[i]>a[i+1] Y
a[i]与a[i+1]交 换
N
n 个数给a[0]到a [5] 输出10 [n-1]
}
课堂小结
冒泡排序的思想是什么? 如何描述数组中相邻的两个数据元素 如何计算和描述循环次数 进一步掌握通过流程图描述算法。
思考
比较过程中,如果让小数上浮,如何实现?
9 0
x[0]
8 2
x[1]
5 4
x[2]
4 5
x[3]
8 2
x[4]
0 9
x[5]
? a[0] a[1]
for(i=1;i<6;i++) if (a[0]>a[i]) { t=a[0];a[0]=a[i];a[i]=t; }
…… for(j=0;j<5;j++) for(i=0;i<5-j;i++) if (a[i]>a[i+1]) { ……}
输出10个数给a[0]到a[9]
for(i=0;i<1;i++) if (a[i]>a[i+1]) { ……}
演示程序15-1 验证结果

如果是10个数呢?
[9] 输入 10 6 个数给a[0]到a[5] j由0变到 8 4 ,共执行 9 5 次循环 9-j 次比较 进行 5-j a[i]>a[i+1] Y
[n-1] 输入 6n 个数给a[0]到a[5] j由0变到 n-2 4 ,共执行 n-1 5 次循环 进行 n-1-j 5-j 次比较 a[i]>a[i+1]
Y
a[i]与a[i+1]交 换
N
n 个数给a[0]到a [5] 输出10 [n-1]
define n 10 void main() { int a[n]; int i,i,t; …… for(i=0;i<n-1;i++) for(i=0;i<n-1-i;i++) if (a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;} ……
a[2]
a[3]
a[4]
a[5]
9 8 5 4 2 0
8 9
5 9 8 4 2 0
4 9
2 9
0 9
5
4
8
5
8
5
8
5
2
0
2
0
4
0
4
2
for(i=2;i<6;i++) if (a[1]>a[i]) { t=a[1];a[1]=a[i];a[i]=t; }
a[0] a[1]
a[2]
a[3]
a[4]
a[5]
a[1]
a[2]
0
4
2
4
a[3]
a[4]
5
8
5
8
a[5]
9
9
for(i=0;i<5;i++) if (a[i]>a[i+1]) { ……}
输入6个数给a[0]到a[5] j由0变到4,共执行5次循环 进行5-j次比较 a[i]>a[i+1] Y a[i]与a[i+1] 交换 N
for(i=0;i<4;i++) if (a[i]>a[i+1]) { ……}
相关文档
最新文档