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

VB各种排序方法


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