vlambda博客
学习文章列表

vb第12讲:选择排序

任务:随机产生5个1-100之间的整数,使用选择排序法将其从小到大排序

体育课上,体育老师让大家按队列从低到高列队。那么实际的操作方法一般是同学们先自觉的两两比较,调换位置,实现一个大概的排序,这实际上是冒泡排序的思想;可是因为身处队伍之中,可能还需要调整,然后老师会在队伍的前面能更宏观的看到排序的合理性,他会单独把某个比较高的同学点出来换到合适的位置,直到排序完成,这是一种选择排序的思想。

一、选择排序过程模拟

选择排序是对冒泡排序法的基础上的一个升级。上一讲的冒泡排序每一趟相邻两个数不仅比较还需要交换。选择排序是先标记再排序,一趟交换一次值。

怎么每一趟只需要一次交换呢?那就需要找出一列数里面的最小(大)值的位置,然后只需要将这个位置上的数和需要放置的位置上的数进行交换。

二、选择排序的思路

  1. 先找出a(1)到a(n)中最小数所在的位置k,一遍扫描完之后,再把a(1)与a(k)互换。

  2. 重复此算法,只是每次重复进行比较的数列范围向后移一个位置。即第二遍从a(2)到a(n)中去找最小数的位置,最后再a(2)与a(k)对调,

  3. 第三遍从a(3)到a(n)中去找最小数的位置,最后把a(3)与a(k)对调,

  4. 此过程得复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 10As 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

温馨提示:
* 本号内容为教育学习使用 ,软件、知识更新等,请以实际为准;
* 本文部分文字、图片均来源于网络,如有侵权,请联系删除。