当前位置:文档之家› VB各种排序方法.ppt

VB各种排序方法.ppt

Dim A(10) As Integer, Temp As Integer Dim I As Integer, J As Integer Dim Pointer As Integer Randomize For I = 1 To 10
A(I) = Int(Rnd * (100 - 1)) + 1
Text1 = Text1 & Str(A(I)) Next I For I = 1 To 9
不交交换换
26 4 5 3 62
第一轮比较
6
6
45
5
54
4
3
3
2
2
第二轮比较
第三轮比较
第I用一二三四≠=元轮素P比oAi(较nP较to结einr束te则r)交不去换交比 A换(AI()I)、A、(AP(oPionitnetre)r) 即排交序换结束A(12)和A(63)
6
6
5
5
4
4
3
3
2
2
第四轮比较
筛选法排序
返回
Dim I As Integer, J As Integer
Randomize
For I = 1 To 10
A(I) = Int(Rnd * (100 - 1)) + 1
Text1 = Text1 & Str(A(I))
Next I
For I = 1 To 9
For J = I + 1 To 10
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 J
Next I
End Sub
Private Sub Command4_Click()
冒泡排序举例:
对整数序列 8 5 2 4 3 按升序排序
冒泡法排序二
1.进行某一轮比较,若发生 数据交换,设置开关值为 真 2. 由于用A(I) 和A(I + 1)比 较要防止数组越界 3.开始一轮比较前,假定这 一轮不发生交换,给开关 设初值为假 4.设置一个控制Do循环的 开关,当某一轮比较中不 发生数据交换时(即开关 值为假),使开关值为假 ,标志排序结束

822



285 3 3
沉 下

382 4 4



48 5 5
个 最

583 8 8


初第 第 始一 二 状趟 趟 态结 结
果果
冒泡法排序二 (按降序排列)
第一论扫视: 1、6、5、4、3、2 6、1、5、4、3、2 6、5、1、4、3、2 6、5、4、1、3、2 6、5、4、3、1、2 6、5、4、3、2、1
返回
Switch = True Do While Switch
Switch = False N=N-1 For I = 1 To N
If A(I) > A(I + 1) Then Switch = True Tem = A(I) A(I) = A(I + 1) A(I + 1) = Tem
End If Next I Loop
第二轮比较:将A(1)和A(2)、A(2)和A(3),, A(N-2)和A(N-1)比较,处理方法和第一轮相同,这一轮比 较结束后A(N-1)中就存放了N个数中第二小的数。 第N-1轮比较:将A(1)和A(2)进行比较,处理方法同上, 比较结束后,这N个数按从小到大的次序排列好。
每一轮的比较后都会使小数逐渐浮起来,大数下沉, 就象冒泡一样
Pointer = I For J = I + 1 To 10
If A(J) < A(Pointer) Then Pointer = J
End If Next J
冒泡法排序
[分析]: (设从小到大排序)
第一轮比较:将A(1)和A(2)比较,若A(1)>A(2)则交换 这两个数组元素的值,否则不交换;然后再用A(2)和A(3) 比较,处理方法相同;以此类推,直到A(N-1)和A(N) 比较后,这时A(N)中就存放了N个数中最大的数。
直接排序
设待排序的N个数存放在数组 A 中
1.确定排序需要几轮的比较
2.设置这一轮指针初值
3.开始一轮的比较
4.进行比较,根据比较结果 决定是否改变指针的值
5.一轮的比较结束后,根据 指针的值与 I 是否不同,确 定是否交换A(I)、A(Pointer) 的值
For I = 1 To N – 1 Pointer = I For J = I + 1 To N If A(Pointer) < A(J) Then
Pointer = J
End If Next J If I <> Optionter Then
T = A( I ) A( I ) = A( Pointer )
A( Pointer ) = A( I )
End If Next I
直接排序
返回
Option Explicit Option Base 1 Private Sub CmdSort_Click()
筛选法排序
2346
不交换 6
6
6
1
交交换换 1234
交换 4
4
32
交换
21
交换 交换 123
交换
3
交换
43
32
21
交换 12
64
43
32
21
第一轮比较
第二轮比较
第三轮比较
第四轮比较
筛选法排序
例:筛选法排序。(设从大到小排序)
[分析]:将N个无序数据存放在 数组中,对数组进行N-1轮扫视。
第一轮扫视:将A(1)与A(2)比较,若A(1)<A(2),则 交换A(1)和A(2)的值;再将A(1)与A(3)、A (4) …… A(N)依次按以上规则比较和交换,第一轮扫视完毕,N个数中 最大数存放到A(1)中。
Option Base 1
Dim A(10) As Integer
Private Sub Command1_Click()
Dim I As Integer, J As Integer
Dim T As Integer, N As Integer
N = UBound(A)
For I = 1 To N - 1
第二轮扫视:将A(2)与A(3)、A(4)…A(N)依次按以上 规则比较;
第三轮扫视:将A(3)与A(4)、A(5)…A(N)依次按以上 规则比较;
第N-1扫视: 将A(N-1)与A(N)按以上规则比较排序完成。
筛选法排序
假定待排序的N个数已存放在数组 A 中
11..确确定定排排序序需需要要几几轮轮的的比比较较
返回
Switch = True Do While Switch
Switch = False N=N-1 For I = 1 To N
If A(I) > A(I + 1) Then Switch = True Tem = A(I) A(I) = A(I + 1) A(I + 1) = Tem
End If Next I Loop
If A(I) > A(J) Then
Temp = A(I)
A(I) = A(J)
A(J) = Temp
End If
Next J
Text2 = Text2 & Str(A(I))
Next I
Text2 = Text2 & Str(A(I))
End Sub
直接排序
I : 1234
Pointer: 12354
For I = 1 To N – 1 For J = I + 1 To N
2.进行每一轮的比较
If A(I) < A(J) then
3.在每一轮比较中,比较两
T = A( I )
个数的大小,根据比较结
A( I ) = A( J )
果决定是否交换两个数
A( J ) = T
End If Next J Text1 = Text1 & Str(A(I)) Next I Text1 = Text1 & Str(A(N))
发生交换,继续下一轮比较
第二轮扫视: 6、5、4、3、2、1 6、5、4、3、2、1 6、5、4、3、2、1 6、5、4、3、2、1 6、5、4、3、2、1
没发生交换,结束比较
冒比较中不发生数 据交换时,使开关值为假, 标志排序结束 2.进行某一轮比较,若发生 数据交换,设置开关值为 真
冒泡排序举例:
对整数序列 8 5 2 4 3 按升序排序


58 5 2 2 2
趟 沉

582 2 4 3 3

逐 渐
284 4 3 4 4
一 个

483 3 5 5 5


38 8 8 8 8
大 的
初第 第 第 第
始一 二 三 四
状趟 趟 趟 趟
程序
态结 结 结 结 果果果果
冒泡法排序一
Option Explicit
相关主题