VB教程——排序算法复习
与a(2) 中的最大数放在a(2)中。这样一共经过4次 选大就把a(1)到a(5)中的数进行由小到大排序。 在排序过程中小数象气泡一样上浮,而大数逐个 下沉,所以叫起泡法。
第1轮: for j=1 to 4 if a(j)>a(j+1) Then t=a(j): a(j)=a(j+1) : a(j+1)=t End if Next j 第2轮: for j=1 to 3 if a(j)>a(j+1) Then t=a(j): a(j)=a(j+1) : a(j+1)=t End if Next j 第3轮: for j=1 to 2 if a(j)>a(j+1) Then t=a(j): a(j)=a(j+1) : a(j+1)=t End if Next j
2、顺序交换法
现在重复上述算法:把a(2)到a(5)中的最小数放在 a(2)中,a(3)到a(5)中的最小数放在a(3)中,a(4)
与a(5)中的最小数放在a(4)中。这样一共经过4次选
小就把a(1)到a(5)中的数进行由小到大排序。
第1轮: for j=2 to 5 if a(1)>a(j) Then t=a(1): a(1)=a(j) : a(j)=t End if Next j 第2轮: for j=3 to 5 if a(2)>a(j) Then t=a(2): a(2)=a(j) : a(j)=t End if Next j 第3轮: for j=4 to 5 if a(3)>a(j) Then t=a(3): a(3)=a(j) : a(j)=t End if Next j
4 插入法
将一个数插入到有序数列,使插入后数列仍然有序的程序清单: Dim a(1 To 10) As Integer For i = 1 To 9 a(i) = (i-1)*3+1 Next i Key = Val(InputBox("输入一个数")) For i=1 to 9 If a(i)>Key Then Exit For next i For k = 9 To i Step -1 a(k + 1) = a(k) Next k a(i) = Key For i = 1 To 10 Print a(i); Next i
顺序排序
2、顺序交换法
对已知存放在数组中的n个数,用顺序交换法按递增顺序排
序。
(1) 从第一个元素开始,将它和其后的每个元素进行比 较,若为逆序,就交换,比较完一轮,a(1)成为数组中的最小
的元素。
(2) 对a(2)和a(n)的n-1个数进行同(1)的操作,次小的 数放入a(2)中,完成第二轮排序。 (3) 进行n-1轮排序,所有的数排序完毕。
第一轮的比较过程: for j=1 to 4 if a(j)>a(j+1) Then t=a(j): a(j)=a(j+1) : a(j+1)=t End if Next j
1、冒泡法
现在重复上述算法:把a(1)到a(4)中的最大数放在
a(4)中,a(1)到a(3) 中的最大数放在a(3)中,a(1)
第i=1 i轮: For to 4 for j=1 to 5-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
第4轮: for j=1 to 1 if a(j)>a(j+1) Then t=a(j): a(j)=a(j+1) : a(j+1)=t End if Next j
排序问题
1、冒泡法(起泡法)
2、顺序交换法 3、选择法 4、插入法
1、冒泡法
首先我们来看把最大的那个数放在最后位置上的方法: 假设有5个数,分别为10,2,6,7,4,存放在a(1)-a(5)中。
首先,从a(1)到a(5),相邻的两数两两进行比较,在每次比
较过程中,若前一个数比后一个数大,则交换两元素的内容。
2、顺序交换法
Dim a(1 To 5) As Integer For i = 1 To 5 a(i) = Val(InputBox("输入一个数")) Next i For i = 1 To 4 For j = i+1 To 5 If a(i) > a(j) Then t = a(i): a(i) = a(j): a(j) = t End if Next j Next i For i = 1 To 5 Print a(i); Next i
1.冒泡法
对已知存放在数组中的n个数,用冒泡法按递增顺序排序。
(1) 从第一个元素开始,将相邻的数比较,若为逆序,
就交换,比较完一轮,最大的数已沉底,成为数组中的最后一 个元素a(n) (2) 对a(1)和a(n-1)的n-1个数进行同(1)的操作,次大 的数放入a(n-1)中,完成第二轮排序。
4 插入法
例 7
将一个数插入到有序的(由小到大)数列中,插 入后数列仍然有序。
key=20
a数组
1 4
7 10 13 16 19 20 22 25 22 25
20 20 20 20 20 20 20 20
算法: 1. 找到插入数在数组中的位置i 2. 将从n到i的每个元素向后移动一个位置 3. 插入数
2、顺序交换法
我们再来看一种将最小的数放在第一个位置的算法
先设定用a(1)存放最小值,然后用a(1)分别与其后
的每一个数a(j)(j=2..5)进行比较,在比较过程中 如果a(1)不是小的数,就将a(1)与a(j)互换。 第一轮的比较过程 For j=2 To 5 if(a(1)>a(j)) Then t=a(1) : a(1)=a(j) : a(j)=t End if Next j
3、选择法
对已知存放在数组中的n个数,用选择法按递增顺序排
序。 (1) 从n个数的序列中选出最小的数,与第1个数交 换位置; (2) 除第1个数外,其余n-1个数再按(1)的方法选 出次小的数,与第2个数交换位置; (3) 重复(1)n-1遍,最后构成递增序列。
3、选择法
n个数选择法递增排序程序清单:
4 插入法
插入法2: 用上面的插入方法将一批数排序(从小到 大),设数列中开始只有一个元素。
(3) 进行n-1轮排序,所有的数排序完毕。
1.冒泡法
n个数冒泡法递增排序程序清单: Dim a%(), i%, j%, n% n = InputBox("请输入一个正整数") ReDim a(1 To n) For i = 1 To n a(i) = Int(Rnd * 100) : Print a(i); Next i 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 Print For i = 1 To n Print a(i); Next i
第1轮: k=1 for j=2 to 5 if a(j)<a(k) Then k=j Next j if k<>1 then t=a(1):a(1)=a(k):a(k)=t 第2轮: k=2 for j=3 to 5 if a(j)<a(k) Then k=j Next j if k<>2 then t=a(2):a(2)=a(k):a(k)=t 第3轮: k=3 for j=4 to 5 if a(j)<a(k) Then k=j Next j if k<>3 then t=a(3):a(3)=a(k):a(k)=t 第4轮: k=4 for j=5 to 5 if a(j)<a(k) Then k=j Next j if k<>4 then t=a(4):a(4)=a(k):a(k)=t
2、顺序交换法
n个数顺序法递增排序程序清单:
Dim a%(), i%, j%, n% n = InputBox("请输入一个正整数") ReDim a(1 To n) For i = 1 To n a(i) = Int(Rnd * 100): Print a(i); Next i 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 Next i Print For i = 1 To n Print a(i); Next i
Dim a%(), i%, j%, n% n = InputBox("请输入一个正整数") ReDim a(1 To n) For i = 1 To n a(i) = Int(Rnd * 100): Print a(i); Next i For i = 1 To n – 1 k=i For j = i + 1 To n If a(j) < a(k) Then k=j Next j if k<>i then t=a(i): a(i)=a(k): a(k)=t Next i Print For i = 1 To n Print a(i); Next i
第i=1 i轮: For to 4 for j=i+1 to 5 if a(i)>a(j) Then t=a(i): a(i)=a(j): a(j)=t End if Next j