发布网友 发布时间:2024-10-19 04:28
共2个回答
热心网友 时间:2024-11-30 06:54
Const n = 20
Dim a(1 To n) As Integer
'降序自定义过程
Sub sort(left As Integer, right As Integer)
For i = left To right - 1
For j = right To i + 1 Step -1
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
End Sub
'方法一:数组先不排序,用2个游标,一个指向左边第1个位置,一个指向右边第n个位置
'如果左边游标指向的是偶数,则指向下一个数字,一直持续直到指向的是奇数
'如果右边游标指向的是奇数,则指向上一个数字,一直持续直到指向的是偶数
'左边游标和右边游标指向的数字交换
'如果左边游标越过右边游标,则循环结束,这时候偶数和奇数已经实现分离,且偶数在前,奇数在后
'分别对偶数和奇数,调用自定义过程,排序
Private Sub Command1_Click()
Dim left As Integer, right As Integer, k As Integer
List2.Clear
left = 1 '左标志
right = n '右标志
Do While True '一直循环
Do While a(left) Mod 2 = 0 '若是偶数,左标志一直往右移
left = left + 1
Loop
Do While a(right) Mod 2 = 1 '若是奇数,右标志一直往左移
right = right - 1
Loop
If left > right Then Exit Do '如果左标志超过右标志,退出循环
t = a(left) '当左是奇数,右是偶数,两者交换
a(left) = a(right)
a(right) = t
Loop
'最后right是指向最后一个偶数,left是指向第一个奇数
Call sort(1, right)
Call sort(left, n)
For i = 1 To n
List2.AddItem Format(i, "00") & " " & a(i)
Next i
End Sub
'方法二:数组中所有数字除2取余,奇数得1,偶数得0
'采用排序算法,按照他们余数大小从小到大排序,最后所有偶数在前,奇数在后
'分别对偶数和奇数,调用自定义过程排序
Private Sub Command2_Click()
Dim i As Integer, j As Integer, k As Integer
List2.Clear
For i = 1 To n - 1
For j = n To i + 1 Step -1
If a(j) Mod 2 < a(j - 1) Mod 2 Then '所有数字除2取余,将奇偶分离,偶在前
t = a(j)
a(j) = a(j - 1)
a(j - 1) = t
End If
Next j
Next i
For i = 1 To n
If a(i) Mod 2 = 0 Then k = k + 1 '找出偶数个数
Next i
Call sort(1, k)
Call sort(k + 1, n)
For i = 1 To n
List2.AddItem Format(i, "00") & " " & a(i)
Next i
End Sub
'方法三:先将数组从大到小排序
'从最后位置N开始往上搜索,找到奇数(位置i),将它保存到临时变量t中
'将i+1~n位置所有数字往前移一位到i~n-1
'将临时变量t,即原先i位置的数字,移动到第n位置
'依次类推,所有奇数全部移到后面,但奇数是从小到大排序的
'将奇数重新,调用自定义过程,从大到小排序一次
Private Sub Command4_Click()
List2.Clear
Call sort(1, n) '数据全部从大到小排序
For i = n To 1 Step -1 '从下到上,找到一个奇数,把后面的数字全部往前移一位,把该奇数移到最后一个位置
If a(i) Mod 2 = 1 Then '最后最小奇数在前,最大奇数在后
k = k + 1 '统计奇数个数
t = a(i) '保存好第i个数字
For j = i To n - 1 '所有数字往前移一位
a(j) = a(j + 1)
Next j
a(n) = t '第i个数字移到最后位置
End If
Next i
Call sort(n - k + 1, n) '奇数重新倒置排序
For i = 1 To n
List2.AddItem Format(i, "00") & " " & a(i)
Next i
End Sub
Private Sub Command3_Click()
List1.Clear
Randomize
For i = 1 To n
a(i) = Int(Rnd * 100)
List1.AddItem Format(i, "00") & " " & a(i)
Next i
End Sub
热心网友 时间:2024-11-30 06:51
好的,没有事