![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
江蘇省二級(jí)VB常用算法(六)排序 |
VB常用算法(六)排序曹蘇群 http://caosuqun.bokee.com 關(guān)鍵詞: 排序 算法
1、算法說明1) 選擇法排序
(1) 從n個(gè)數(shù)中選出最小數(shù)的下標(biāo),出了循環(huán),將最小數(shù)與第一個(gè)數(shù)交換位置; (2) 除第一個(gè)數(shù)外,在剩下的n-1個(gè)數(shù)中再按方法(1)選出次小的數(shù),與第二個(gè)數(shù)交換位置; (3) 以此類推,最后構(gòu)成遞增序列。 譬如: 8 6 9 3 2 7 第一輪交換后 2 6 9 3 8 7 第二輪交換后 2 3 9 6 8 7 第三輪交換后 2 3 6 9 8 7 第四輪交換后 2 3 6 7 8 9 第五輪無交換 2 3 6 7 8 9
程序代碼如下: Private Sub xzPaiXu(a() As Double, sheng As Boolean) 'a為需要排序的數(shù)組,sheng為True則為升序排列,為False,則為降序排列。 Dim i As Integer, j As Integer Dim temp As Double Dim m As Integer For i = LBound(a) To UBound(a) - 1 '進(jìn)行數(shù)組大小-1輪比較 m = i '在第i輪比較時(shí),假定第'i個(gè)元素為最值元素 For j = i + 1 To UBound(a) '在剩下的元素中找出最 '值元素的下標(biāo)并記錄在m中 If sheng Then '若為升序,則m記錄最小元素 '下標(biāo),否則記錄最大元素下標(biāo) If a(j) < a(m) Then m = j Else If a(j) > a(m) Then m = j End If Next j '將最值元素與第i個(gè)元素交換 temp = a(i) a(i) = a(m) a(m) = temp Next i End Sub
調(diào)用該過程示例: Option Base 1 Private Sub Command1_Click() Dim b(6) As Double b(1) = 8 b(2) = 6 b(3) = 9 b(4) = 3 b(5) = 2 b(6) = 7 Call xzPaiXu(b, True) For i% = 1 To 6 Print b(i) Next End Sub
2) 冒泡法排序 選擇排序法在每一輪排序時(shí)找最值元素的下標(biāo),出了內(nèi)循環(huán)(一輪排序結(jié)束),再交換最小數(shù)的位置;而冒泡法在每一輪排序時(shí)將相鄰的數(shù)比較,當(dāng)次序不對(duì)就交換位置,出了內(nèi)循環(huán),最值數(shù)已經(jīng)冒出。 譬如: 8 6 9 3 2 7 8 6 9 3 2 7 8 6 9 2 3 7 8 6 2 9 3 7 8 2 6 9 3 7 2 8 6 9 3 7 …. 2 3 8 6 9 7 …. 2 3 6 8 7 9 …. 2 3 6 7 8 9 …. 2 3 6 7 8 9
程序代碼如下:
Private Sub mpPaiXu(a() As Double, sheng As Boolean) 'a為需要排序的數(shù)組,sheng為True則為升序排列,為False,則為降序排列。 Dim i As Integer, j As Integer Dim temp As Double Dim m As Integer For i = LBound(a) To UBound(a) - 1 '進(jìn)行n-1輪比較
For j = UBound(a) To i + 1 Step -1 '從n到i個(gè)元素兩兩進(jìn)行比較
If sheng Then '若次序不對(duì),馬上進(jìn)行交換
If a(j) < a(j - 1) Then temp = a(j) a(j) = a(j - 1) a(j - 1) = temp End If Else If a(j) > a(j - 1) Then temp = a(j) a(j) = a(j - 1) a(j - 1) = temp End If End If Next j '出了內(nèi)循環(huán),一輪排序結(jié)束 '最值元素冒到最上邊 Next i End Sub
調(diào)用該過程代碼基本同上。
2、實(shí)戰(zhàn)練習(xí)1) 補(bǔ)充代碼(2003秋二(10)) 下面是一個(gè)采用拉鋸式排序法對(duì)數(shù)組元素按升序進(jìn)行排序的程序,所謂“拉鋸式排序法”是這一遍把最小的元素從下到上送到最上的位置,下一遍則是從上到下把最大的元素送到最下的位置。
Option Base 1 Private Sub Command1_Click() Dim a(10) As Integer,i As Integer For i = 1 To 10 a(i) = Int(Rnd * 10)+1 Text1 = Text1 & Str(a(i)) Next i Call shaker_sort(a) For i = 1 To 10 Text2 = Text2 & Str(a(i)) Next i End Sub
Private Sub Shaker_sort(k() As Integer) Dim i As Integer,c As Integer,d As Integer Dim t As Integer c = 1 d = (1) Do For (2) Step-1 If k(i=1)>k(i) Then t = k(i-1):k(i-1) = k(i):k(i) = t End If Next i (3) For i = c+1 To d If (4) Then t = k(i-1):k(i-1) = k(i):k(i) = t End If Next i d = d-1 Loop While (5) End Sub
2) 編程題(2002秋上機(jī)試卷04) 把文本框輸入的字符串按降序添加到列表框中。 |