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

VB各种排序方法


Loop
冒泡排序举例:
对整数序列 8 5 2 4 3 按升序排序
8 小 的 逐 渐 上 升 5 2 8 2 3 8 4 8 每 趟 沉 下 一 个 最 大 的
2 3 4 5
2 3 4 5
3 5 8
初 始 状 态
8
第 一 趟 结 果
8
第 二 趟 结 果
冒泡法排序二
第一论扫视: 1、6、5、4、3、2 6、1、5、4、3、2 6、5、1、4、3、2
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
筛选法排序
假定待排序的N个数已存放在数组 A 中 For I1 To N If A(I) < A(J) then T = A( I ) A( I ) = A( J ) A( J ) = T
1.确定排序需要几轮的比较 1.确定排序需要几轮的比较
2.进行每一轮的比较 3.在每一轮比较中,比较两 个数的大小,根据比较结 果决定是否交换两个数
返回
冒泡法排序
[分析]: (设从小到大排序) 第一轮比较:将A(1)和A(2)比较,若A(1)>A(2)则交换 这两个数组元素的值,否则不交换;然后再用A(2)和A(3) 比较,处理方法相同;以此类推,直到A(N-1)和A(N) 比较后,这时A(N)中就存放了N个数中最大的数。
第二轮比较:将A(1)和A(2)、A(2)和A(3),, A(N-2)和A(N-1)比较,处理方法和第一轮相同,这一轮比 较结束后A(N-1)中就存放了N个数中第二小的数。
返回
直接排序
I: 1 4 3 2 6 5 4 4 5 3 2
第二轮比较
Pointer: 1 4 5 3 2 6 5 4 3 2
不交换 交换 6 5 4 3 2
第四轮比较
6 2 4 5 3 2 6
第一轮比较
6 5 4 3 2
第三轮比较
第四轮比较结束 第三轮比较结束 第二轮比较结束 第一轮比较结束 去比 用元素A(Pointer) I ≠ Pointer 则交换 = 较 则不交 换A(I) 、A(Pointer) A(I) 、A(Pointer) 排序结束 即交换A(2)和A(3) 即交换A(1)和A(6)
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() 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 Pointer = I For J = I + 1 To 10 If A(J) < A(Pointer) Then Pointer = J End If Next J
直接排序
1.确定排序需要几轮的比较 2.设置这一轮指针初值
设待排序的N个数存放在数组 A 中 For I = 1 To N – 1 Pointer = I For J = I + 1 To N
3.开始一轮的比较
4.进行比较,根据比较结果 决定是否改变指针的值 5.一轮的比较结束后,根据 指针的值与 I 是否不同,确 定是否交换A(I)、A(Pointer) 的值
(按降序排列)
第二轮扫视: 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
6、5、4、1、3、2
6、5、4、3、1、2 6、5、4、3、2、1
发生交换,继续下一轮比较
没发生交换,结束比较
冒泡法排序二
1.设置一个控制循环开关, 当某一轮比较中不发生数 据交换时,使开关值为假, 标志排序结束 2.进行某一轮比较,若发生 数据交换,设置开关值为 真
5 2 4
2 4 3 5 8
第 二 趟 结 果
2 3 4
2 3 4
3
8
第 一 趟 结 果
5
8
第 三 趟 结 果
5
8
第 四 趟 结 果
3 8
初 始 状 态
程序
冒泡法排序一
Option Explicit 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 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()
第N-1轮比较:将A(1)和A(2)进行比较,处理方法同上, 比较结束后,这N个数按从小到大的次序排列好。
每一轮的比较后都会使小数逐渐浮起来,大数下沉, 就象冒泡一样
冒泡排序举例:
对整数序列 8 5 2 4 3 按升序排序
每 趟 沉 下 一 个 最 大 的
小 的 逐 渐 上 升
8 5 5 2 8 2 4 8 4 3 8
返回
Loop
冒泡法排序二
1.进行某一轮比较,若发生 数据交换,设置开关值为 真 2. 由于用A(I) 和A(I + 1)比 较要防止数组越界 3.开始一轮比较前,假定这 一轮不发生交换,给开关 设初值为假 4.设置一个控制Do循环的 开关,当某一轮比较中不 发生数据交换时(即开关 值为假),使开关值为假 ,标志排序结束
End If
Next J Text1 = Text1 & Str(A(I)) Next I Text1 = Text1 & Str(A(N))
筛选法排序
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 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
返回
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
筛选法排序
6 4 3 2 1 2 3
不交换
交换 交换 交换
6 4 3 2 1 1 2
交换
6 交换
交换
6 4
交换 交换
4 3 2 1
3
交换
3 4
4 6
第一轮比较
2 3
3 4
第二轮比较
1 2
2 3
第三轮比较
2 1
1 2
第四轮比较
筛选法排序
例:筛选法排序。(设从大到小排序) [分析]:将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)中。 第二轮扫视:将A(2)与A(3)、A(4)…A(N)依次按以上 规则比较; 第三轮扫视:将A(3)与A(4)、A(5)…A(N)依次按以上 规则比较; 第N-1扫视: 将A(N-1)与A(N)按以上规则比较排序完成。
相关主题