从VB来看-BubbleSort(VB冒泡排序)

                       

冒泡排序  有时也被叫做交换排序 沉没排序 ,是一种简单的排序算法通过列表反复步骤进行排序,每对相邻的项目进行比较,根据需要的升降序交换他们。 这是一种比较排序 ,虽然算法简单,但是存在大量数据排列较慢,不切实际的问题。

时间复杂度:

若待排数据的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数  和记录移动次数  均达到最小值时 ,有最好时间复杂度,为:O(n)。反之,若此数列倒序则为最坏时间复杂度,为O(n^2)。

排序的稳定性:

在冒泡排序的整个过程中,比较大小进行交换,不会改变相同数值的相对位置,所以 是一种 稳定的排序算法。若需要更多讲解举例解释可以看看这个内容 :从VB来看-排序

冒泡排序分为外循环及内循环两个过程,当执行小数下沉大数上浮的过程中,每完成一次外循环都将整理出待排序列中最大的一个数。举例如下: 当随机数列  a[i]=(6,7,0,3,4,2,8,5,9,1) 执行一次冒泡排序外循环的过程如下: 
6 7 0 3 4 2 8 5 9 1)→ (6 7  0 3 4 2 8 5 9 1)
(6 7 0  3 4 2 8 5 9 1)→ (6 0 7  3 4 2 8 5 9 1)
(6 0 7 3 4 2 8 5 9 1)→ (6 0 3 7 4 2 8 5 9 1)
(6 0 3 7 4 2 8 5 9 1)→ (6 0 3 4 7 2 8 5 9 1)
(6 0 3 4 7 2 8 5 9 1)→ (6 0 3 4 2 7 8 5 9 1)
(6 0 3 4 2 7 8 5 9 1)→ (6 0 3 4 2 7 8 5 9 1)
(6 0 3 4 2 7 8 5 9 1)→ (6 0 3 4 2 7 5 8 9 1)
(6 0 3 4 2 7 5 8 9 1)→ (6 0 3 4 2 7 5 8 9 1)
(6 0 3 4 2 7 5 8 9 1)→ (6 0 3 4 2 7 5 8 1 9
若排序数列为N个数,即需要执行N-1次外循环。

冒泡排序的完整过程可参考如下动图:

 

数字冒泡
  图像来自与维基百科

下面还有四种抽象化的冒泡排序形象表达

 

随机冒泡  随机数列的冒泡排序
  独特冒泡  独特数列的冒泡排序
  倒序冒泡  倒序数列的冒泡排序
  相近冒泡  相近数列的冒泡排序

   

黑色为排好的部分  灰色是待排的部分 红色三角标记算法的位置 冒泡排序抽象动图来自与: toptal

从VB来看-冒泡排序

下面这个是我们可以常在书本学习中看到的VB冒泡排序的版本:

任务一:在a(i)中随机产生十个不相同的两位数Private Sub From_Load ()   Dim p As String   Randomize   p = ""   For i = 1 To 10     Do       x = Int(Rnd*91) + 10       flog = 0       For j=1 To i-1     '使产生的数组元素互不相同          If x=a(j) Then flog = 1 : Exit For       Next j     Loop While flog =1     '显示随机生成的数组     a(i) = x     p =p & Str(a(i)) & ","   Next i   Label1.caption =LTrim(Left(p,Len(p) -1 ))End sub
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
任务二:点击按钮启动冒泡排序Private Sub Command1_Click() For i = 1 To 9   For j = 1 To 10 -i      if a(j) < a(j+1) then         t=a(j)         a(j) = a(j+1)         a(j+1) = t      End if   Next jNext i'显示排好的数组For i = 1 To 10   p = p & Str(a(i)) & ","Next iLabel1.caption =LTrim(Left(p,Len(p) -1 ))End Sub
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

虽然冒泡排序在所有排序中的应用性不是很强,但为了严谨认真的运用及学习,还是有了下面这个在程序编码中使用的版本。

任务一:根据输入的"txtSize"值,产生"mArray"数组Private Sub Command1_Click()                      Dim IDim J    If Len(Trim$(txtSize)) = 0 Then txtSize = "0"    ReDim mArray(CDbl(txtSize) - 1)              '转换成双精度型    Randomize    lstUnsorted.Clear    For I = 0 To CDbl(txtSize) - 1        J = Int((32767 - (-32768) + 1) * Rnd + (-32768))        lstUnsorted.AddItem Str$(J)        mArray(I) = J    NextEnd Sub
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

下面使用了Do While … Loop 循环,想想有什么好处及不同

任务二:将 "mArray" 数组冒泡排序Sub BubbleSort(MyArray(), ByVal nOrder As Integer)Dim Index          '标记将要比较交换的元素Dim TEMP           '临时存放需要交换的元素Dim NextElement    '将要执行算法排出的下一个元素    NextElement = 0                     Do While (NextElement < UBound(MyArray))        Index = UBound(MyArray)        Do While (Index > NextElement)'根据输入的"nOrder"值,判断将升序或降序            If nOrder = ASCENDING_ORDER Then     '升序                If MyArray(Index) < MyArray(Index - 1) Then                    TEMP = MyArray(Index)                    MyArray(Index) = MyArray(Index - 1)                    MyArray(Index - 1) = TEMP                End If            ElseIf nOrder = DESCENDING_ORDER Then   '降序                If MyArray(Index) >= MyArray(Index - 1) Then                    TEMP = MyArray(Index)                    MyArray(Index) = MyArray(Index - 1)                    MyArray(Index - 1) = TEMP                End If            End If            Index = Index - 1            gIterations = gIterations + 1   '"gIterations"记录循环的次数        Loop        NextElement = NextElement + 1        gIterations = gIterations + 1    LoopEnd Sub
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

好啦,想要分享给大家的内容就是这些,虽然对于冒泡有一些自己的认识和理解,但是想要完整的展示给大家还需要在网上查询很多的资料和素材,这些都标明了出处。
希望这篇文章能够帮到大家对于算法有更多更清晰的认识。
如果您有什么建议和想法欢迎提出,我会及时回复!
感谢您的阅读~

           

猜你喜欢

转载自blog.csdn.net/qq_44952746/article/details/89470534
VB