vb第12讲:选择排序
任务:随机产生5个1-100之间的整数,使用选择排序法将其从小到大排序
体育课上,体育老师让大家按队列从低到高列队。那么实际的操作方法一般是同学们先自觉的两两比较,调换位置,实现一个大概的排序,这实际上是冒泡排序的思想;可是因为身处队伍之中,可能还需要调整,然后老师会在队伍的前面能更宏观的看到排序的合理性,他会单独把某个比较高的同学点出来换到合适的位置,直到排序完成,这是一种选择排序的思想。
一、选择排序过程模拟
选择排序是对冒泡排序法的基础上的一个升级。上一讲的冒泡排序每一趟相邻两个数不仅比较还需要交换。选择排序是先标记再排序,一趟交换一次值。
怎么每一趟只需要一次交换呢?那就需要找出一列数里面的最小(大)值的位置,然后只需要将这个位置上的数和需要放置的位置上的数进行交换。
二、选择排序的思路
先找出a(1)到a(n)中最小数所在的位置k,一遍扫描完之后,再把a(1)与a(k)互换。
重复此算法,只是每次重复进行比较的数列范围向后移一个位置。即第二遍从a(2)到a(n)中去找最小数的位置,最后再a(2)与a(k)对调,
第三遍从a(3)到a(n)中去找最小数的位置,最后把a(3)与a(k)对调,
…
此过程得复n-1次后,即将a数组中的n个数按由小到大的顺序排好。
这种排序法叫选择法。
三、选择排序算法的核心工作
在待排序数据a(i)至a(n)范围内寻找最小值
将最小值与待排序首元素a(i)交换,并修改待排序的范围。
1、如何在a(i)至a(n)范围内寻找最小数?
先选取某一数为最小数,以变量k表示数组a最小值元素的下标
设置循环变量j,j从i+1至n,循环n-i次
在每次循环中,比较a(k)与a(j)的大小,如果a(j)的值比a(k)小,说明找到了新的最小数,执行赋址操作k=j
循环结束,a(k)即为该范围内的最小数。
2、交换最小数a(k)与a(i)的值?
通过交换算法,将存放最小数的a(k)与a(i)相互交换。
四、程序实现
Private Sub Command1_Click()
Dim a(1 To 10) As Integer
Dim i, j, min, k, temp As Integer
Print "原始数据:"
For i = 1 To 10
a(i) = Int(Rnd * 100) + 1
Print a(i);
Next i
Print
For i = 1 To 9
min = a(i)
k = i
For j = i + 1 To 10
If a(j) < min Then
min = a(j)
k = j
End If
Next j
temp = a(i)
a(i) = a(k)
a(k) = temp
Next i
Print "从小到大排序后的数据:"
For i = 1 To 10
Print a(i);
Next i
Print
End Sub