排序算法的分析及实现 冒泡排序和选择排序
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
d(3) 18 18 32
d(3) 32 32
d(4) 18 18 18 36
d(4) 36 36 36
d(4) 36 36
For j=1 to 3 step 1
if d(j+1)<d(j) then 交换d(j) 和d(j+1)的值
Next j
For j=1 to 2 step 1
if d(j+1)<d(j) then 交换d(j) 和d(j+1)的值
d(3) 36 32 32
d(3) 32 32
d(4) 18 32 32 32
d(4) 32 36 36
d(4) 36 36
For j=3 to 1 step -1
if d(j+1)<d(j) then 交换d(j) 和d(j+1)的值
Next j
For j=3 to 2 step -1
if d(j+1)<d(j) then 交换d(j) 和d(j+1)的值
•
c=c+1
•
Next j
•
i=i+1
• Loop
• Label3.Caption = "排序过程的加工遍数为" + Str(i) + " 比较次数为" + Str(c)
选择排序算法
选择排序算法是对冒泡排序算法的改进。
这种方法是在参加排序的所有数组元素中找出最小(或最大) 数据的元素,使它与第一个元素中的数据相互交换位置。然 后再在余下的元素中找出最小(或最大)的数据的元素,与 第二个元素中的数据相互交换位置。以此类推,直到所有的 元素成为一个有序的序列。
Next j
For j=4 to 3 step -1
if d(j)<d(j-1) then 交换d(j) 和d(j-1)的值
Next j
For j=4 to 4 step -1
if d(j)<d(j-1) then 交换d(j) 和d(j-1)的值
Next j
第一遍 J从4到2
i=1
以i表示次
For j=4 to 2 ste数p -1
d(1)=27 d(2)=36 d(3)=32 d(4)=18
原始序列
d(1) 27 d(2) 36 d(3) 32 d(4) 18
最终序列
d(1) 18 d(2) 27 d(3) 32 d(4) 36
(1)第一遍冒泡(最小数冒到最上面)
d(1) 27 d(2) 36 d(3) 32 d(4) 18
Next j
//决定排序的遍数 //决定方向 //决定升序还是降序
冒泡优化
• 1.通过设置一个变量来标记是否发生了交换,如果没有发生交换就提前结束 排序 [原2015.10浙江选考第16题]通过修改“优化一”按钮的代码来验证 (修改框处代码)。
• i = 1: c = 0
• flag = True
如何实现将较 小数逐次从下 向上推移呢?
从最后一个元素起,依次比较相邻的两个元素中的数 据,将较小的数据调换到上面。
冒泡排序
例:将以下四个数组元素用冒泡法进行排序(从小到大)
用数组来存储一系列同类型的数据, 然后调整数组中的元素
dim d(1 to 4) as integer ‘定义一个数组变量d
if d(j)<d(j-1) then 交换d(j) 和d(j-1)的值
Next j
算法分析
第二遍 J从4到3
i=2
For j=4 to 3 step -1
if d(j)<d(j-1) then 交换d(j) 和d(j-1)的值
Next j
第三遍 J从4到4
i=3
For j=4 to 4 step -1
Next j
For j=1 to 1 step 1
if d(j+1)<d(j) then 交换d(j) 和d(j+1)的值
Next j
从前往后升序冒泡(j+1)
For i = 1 To n-1 For j = 1 To n - i If a(j) > a(j + 1) Then t = a(j) a(j) = a(j + 1) a(j + 1) = t End If Next i
if d(j)<d(j-1) then 交换d(j) 和d(j-1)的值
Next j
For i = 1 To 3(num-1) i=1F…or2…j 3= 4(num) To i + 1 Step -1
For j=4 to i+1 step -1
if Idf(j)d<(dj()j-<1)dt(hjen- 1交) 换Thde(jn) 和d(j-1)的值 Next交j 换k d= (dj()j)和: d(dj)(j=-d1()j的- 1值): d(j - 1) = k
Next j
//决定排序的遍数 //决定升序还是降序
小结:
1、冒泡排序:是指把n个要排序的数看成一垂直列,从最下
面的数开始两两比较相邻的两个数,把小的数向上换,经过n-1遍处 理以达到排序目的的一种排序方法。
2、如果有n个数组的元素进行排序,则要进行n-1趟冒泡
第一趟冒泡要经过n-1次比较
第二趟冒泡要经过n-2次比较 …….
空椅子
(1)第一遍冒泡(最小数冒到最上面)
d(1) 27 d(2) 36 d(3) 18 d(4) 32
空椅子
d(1) 27 d(2) 18 d(3) 36 d(4) 32
空椅子
d(1) 27 d(2) 18 d(3) 36 d(4) 32
空椅子
d(1) 18 d(2) 27 d(3) 36 d(4) 32
iFford(j4=)3<(dn(-31)) tthoe1n s交te换p d-1(4) 和d(3)的值 if dif(3d)(<j+d(12))<tdh(ej)nth交en换d交(3换) d和(jd)(和2)d的(j值-1)的值 iNf edxt(2j)<d(1) then 交换d(2) 和d(1)的值
定义了一个整数类型 的数组变量d, 下标从
1到1000
d(1) d(2) d(3) d(4) … … … … … … d(1000)
27 36 32 18 … … … … … …
16
冒泡排序算法
冒泡排序法是简单的排序方法之一,它和气泡从水中往 上冒的情况有些类似。
方法 :是在一列数据中把较小的数逐次向 上推移的一种排序技术。
由于排序过程中,交换的次数比冒泡排序少,因此它具有较高的效率。
选择排序
例:将以下四个数组元素用选择进行排序(从小到大)
用数组来存储一系列同类型的数据, 然后调整数组中的元素
• Do While i <= n - 1 or flag
• flag = False
• For j = n To i + 1 Step -1
•
If a(j) < a(j - 1) Then
•
k = a(j): a(j) = a(j - 1): a(j - 1) = k
•
flag = True
•
End If
if d(j+1)<d(j) then 交换d(j) 和d(j+1)的值
通项式
(1)第一遍冒泡 (2)第二遍冒泡 (3)第三遍冒泡
d(1) 27 27 27 18
d(1) 18 18 18
d(1) 18 18
d(2) 36 36 18 27
d(2) 27 27 27
d(2) 27 27
d(3) 32 18 36 36
Next j
//决定排序的遍数 //决定升序还是降序
从前往后升序冒泡第一遍
d(1) 27
1 j 27
27
d(2) 36 d(3) 32
2 j+136
32
2 j 32 3 j+1 36
d(4) 18
18
18
27 32
3 j 18 4 j+136
iFford(j2=)1<dto(13)(tnh-e1n) s交te换p d-1(2) 和d(1)的值 if dif(3d)(<j+d(12))<tdh(ej)nth交en换d交(3换) d和(jd)(和2)d的(j值-1)的值 iNf edxt(4j)<d(3) then 交换d(4) 和d(3)的值
d(1) 18 18
d(2) 36 36 18 27
d(2) 27 27 27
d(2) 27 27
d(3) 32 18 36 36
d(3) 36 32 32
d(3) 32 32
d(4) 18 32 32 32
d(4) 32 36 36
d(4) 36 36
For j=4 to 2 step -1
if d(j)<d(j-1) then 交换d(j) 和d(j-1)的值
if d(j)<d(j-1) then 交换d(j) 和d(j-1)的值
通项式
(2)第二遍冒泡
d(1) 18
18
18
d(2) 27
27
2 27
d(3) 36 3 j-1 32
3 32
d(4) 32 4 j 36
36
For j=4 to 3 step -1
if d(j)<d(j-1) then 交换d(j) 和d(j-1)的值
空椅子
(1)第一遍冒泡 (2)第二遍冒泡 (3)第三遍冒泡
d(1) 27 27 27 18
d(1) 18 18 18
d(1) 18 18
d(2) 36 36 18 27
d(2) 27 27 27
d(2) 27 27
d(3) 32 18 36 36
d(3) 36 32 32
d(3) 32 32
d(4) 18 32 32 32
Next j
For j=3 to 3 step -1
if d(j+1)<d(j) then 交换d(j) 和d(j+1)的值
Next j
从后往前升序冒泡(j+1)
For i = 1 To n-1 For j = n-1 To i Step -1 If a(j) > a(j + 1) Then t = a(j) a(j) = a(j + 1) a(j + 1) = t End If Next i
End If
Next j
Num:数组元素 的个数
问:5个数比 较怎么改?
Next i
从后往前升序冒泡
For i = 1 To n-1 For j = n To i+1 Step -1 If a(j) < a(j - 1) Then t = a(j) a(j) = a(j - 1) a(j - 1) = t End If Next i
d(4) 32 36 36
d(4) 36 36
(1)第一遍冒泡
d(1) 27
27
d(2) 36
36
d(3) 32 3 j-1 18
d(4) 18 4 j 32
27
2j-1 18 3 j 36
32
1 j-1 18 2 j 27
36 32
iFford(j4=)4<dto(32) tshteenp -交1 换d(4) 和d(3)的值 if dif(3d)(<j)d<(2d)(jt-h1e)nthe交n换交d(换3)d和(j)d和(2d)的(j-值1)的值 iNf edxt(2j)<d(1) then 交换d(2) 和d(1)的值
排序算法的分析及实现
冒泡排序和选择排序
交换数据的实现(A=3:B=5)
C=A
A
C
B
3
5
交换数据的实现(A=3:B=5)
C=A
A
C
B
A=B
3
5
交换数据的实现(A=3:B=5)
C=A
A
Cห้องสมุดไป่ตู้
B
5
3
A=B
B=C
数组
• 为了存储一组数据,我们需要用到数组变量
• 例如 dim d(1 to 1000) as integer
空椅子
dd((11)) 27 dd((22)) 36 dd((33)) 3128 dd((44)) 32
d(1) 27 d(2) 36 d(3) d(4) 32
空椅子 两个数进行数空据椅子交换, 就象两杯水进行交换,
18 需要再拿一个18空杯
d(1) 27 d(2) 36 d(3) 18 d(4) 32
第n-1趟冒泡要经过1次比较
总计:(n-1)+(n-2)+(n-3)+………+2+1=n(n-1)/2
j与j-1变成j与j+1
d(1) 27
27
d(2) 36
36
d(3) 32 3 j 18
d(4) 18 4 j+1 32
27
2 j 18 3 j+1 36
32
1 j 18 2 j+1 27
36 32
if d(j+1)<d(j) then 交换d(j) 和d(j+1)的值
通项式
(1)第一遍冒泡 (2)第二遍冒泡 (3)第三遍冒泡
d(1) 27 27 27 27
d(1) 27 27 27
d(1) 27 18
d(2) 36 36 32 32
d(2) 32 32 18
d(2) 18 27
d(3) 32 32 36 18
Next j
(3)第三遍冒泡
18
18
27
27
32
3 32
36
4 36
For j=4 to 4 step -1
if d(j)<d(j-1) then 交换d(j) 和d(j-1)的值
Next j
(1)第一遍冒泡 (2)第二遍冒泡 (3)第三遍冒泡
d(1) 27 27 27 18
d(1) 18 18 18