Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3553|回复: 13

[已解决]【求教】对一维数组排序

[复制链接]
发表于 2010-4-9 12:39 | 显示全部楼层 |阅读模式

【求教】对一维数组排序

情况有2种:

第1种是数字没有空值的排序

第2中有空值的排序,非空值排前面

请老师分别解答2种情况,同时请指明下改变什么地方得升序或者降序。

最佳答案
2010-4-9 13:26

编了一个函数,采用冒泡排序。


Sub Test()
    Arr = Array(1, 4, 3, 2, "", "", "")
    MsgBox Join(排序(Arr, "JX"), ",")
End Sub

Function 排序(ByVal Arr, ByVal Order)
    Dim i&, j&, Temp As Variant
    Dim OK As Boolean
    '先把所有的空值排到前面
    j = UBound(Arr)
    i = LBound(Arr)
    Do
        Do While Len(Arr(j)) > 0 And i < j
            j = j - 1
        Loop
        If i < j Then
            Do While Len(Arr(i)) = 0 And i < j
                i = i + 1
            Loop
        End If
        If i < j Then
            Temp = Arr(j)
            Arr(j) = Arr(i)
            Arr(i) = Temp
        End If
    Loop Until i = j
    '排序
    If j > LBound(Arr) Then j = j + 1
    If Order = "SX" Then '升序
        Do
            OK = True
            For i = UBound(Arr) To j + 1 Step -1
                If Arr(i - 1) > Arr(i) Then
                    Temp = Arr(i - 1)
                    Arr(i - 1) = Arr(i)
                    Arr(i) = Temp
                    OK = False
                End If
            Next i
        Loop Until OK
    Else
        Do
            OK = True
            For i = UBound(Arr) To j + 1 Step -1
                If Arr(i - 1) < Arr(i) Then
                    Temp = Arr(i - 1)
                    Arr(i - 1) = Arr(i)
                    Arr(i) = Temp
                    OK = False
                End If
            Next i
        Loop Until OK
    End If
    排序 = Arr
End Function
发表于 2010-4-9 12:41 | 显示全部楼层
回复

使用道具 举报

发表于 2010-4-9 13:04 | 显示全部楼层
回复

使用道具 举报

发表于 2010-4-9 13:09 | 显示全部楼层

排序好像是冒泡算法?

回复

使用道具 举报

发表于 2010-4-9 13:26 | 显示全部楼层    本楼为最佳答案   

编了一个函数,采用冒泡排序。


Sub Test()
    Arr = Array(1, 4, 3, 2, "", "", "")
    MsgBox Join(排序(Arr, "JX"), ",")
End Sub

Function 排序(ByVal Arr, ByVal Order)
    Dim i&, j&, Temp As Variant
    Dim OK As Boolean
    '先把所有的空值排到前面
    j = UBound(Arr)
    i = LBound(Arr)
    Do
        Do While Len(Arr(j)) > 0 And i < j
            j = j - 1
        Loop
        If i < j Then
            Do While Len(Arr(i)) = 0 And i < j
                i = i + 1
            Loop
        End If
        If i < j Then
            Temp = Arr(j)
            Arr(j) = Arr(i)
            Arr(i) = Temp
        End If
    Loop Until i = j
    '排序
    If j > LBound(Arr) Then j = j + 1
    If Order = "SX" Then '升序
        Do
            OK = True
            For i = UBound(Arr) To j + 1 Step -1
                If Arr(i - 1) > Arr(i) Then
                    Temp = Arr(i - 1)
                    Arr(i - 1) = Arr(i)
                    Arr(i) = Temp
                    OK = False
                End If
            Next i
        Loop Until OK
    Else
        Do
            OK = True
            For i = UBound(Arr) To j + 1 Step -1
                If Arr(i - 1) < Arr(i) Then
                    Temp = Arr(i - 1)
                    Arr(i - 1) = Arr(i)
                    Arr(i) = Temp
                    OK = False
                End If
            Next i
        Loop Until OK
    End If
    排序 = Arr
End Function
回复

使用道具 举报

 楼主| 发表于 2010-4-9 14:57 | 显示全部楼层

QUOTE:
以下是引用amulee在2010-4-9 13:26:00的发言:

编了一个函数,采用冒泡排序。


Sub Test()
    Arr = Array(1, 4, 3, 2, "", "", "")
    MsgBox Join(排序(Arr, "JX"), ",")
End
  Sub

Function 排序(ByVal Arr, ByVal Order)
    Dim i&, j&, Temp As
  Variant
    Dim OK As
  Boolean
    '先把所有的空值排到前面
    j = UBound(Arr)
    i = LBound(Arr)
    Do
        Do
  While Len(Arr(j)) > 0 And i < j
            j = j - 1
        Loop
        If i < j Then
            Do
  While Len(Arr(i)) = 0 And i < j
                i = i + 1
            Loop
        End
  If
        If i < j Then
            Temp = Arr(j)
            Arr(j) = Arr(i)
            Arr(i) = Temp
        End
  If
    Loop
  Until i = j
    '排序
    If j > LBound(Arr) Then j = j + 1
    If Order = "SX" Then
  '升序
        Do
            OK = True
            For i = UBound(Arr) To j + 1 Step -1
                If Arr(i - 1) > Arr(i) Then
                    Temp = Arr(i - 1)
                    Arr(i - 1) = Arr(i)
                    Arr(i) = Temp
                    OK = False
                End
  If
            Next i
        Loop
  Until OK
    Else
        Do
            OK = True
            For i = UBound(Arr) To j + 1 Step -1
                If Arr(i - 1) < Arr(i) Then
                    Temp = Arr(i - 1)
                    Arr(i - 1) = Arr(i)
                    Arr(i) = Temp
                    OK = False
                End
  If
            Next i
        Loop
  Until OK
    End
  If
    排序 = Arr
End
  Function

呀,好复杂呀。升序怎么排呢???

没有空值的情况,宏可以简单些吗???

回复

使用道具 举报

发表于 2010-4-9 15:14 | 显示全部楼层

函数如下:

Arr=排序(Arr, "JX")

第一个参数输入数组,第二个参数为升序"SX"或降序"JX"

该函数已经考虑了空值和非空值的两种情况了。

回复

使用道具 举报

 楼主| 发表于 2010-4-9 15:43 | 显示全部楼层

QUOTE:
以下是引用amulee在2010-4-9 15:14:00的发言:

函数如下:

Arr=排序(Arr, "JX")

第一个参数输入数组,第二个参数为升序"SX"或降序"JX"

该函数已经考虑了空值和非空值的两种情况了。

我就想,如果不考虑空值,可能速度更快些,而且宏也比较简单。

再望赐教

回复

使用道具 举报

发表于 2010-4-9 15:50 | 显示全部楼层

Function 排序(ByVal Arr, ByVal Order)
    Dim i&, j&, Temp As Variant
    Dim OK As Boolean
    j = LBound(Arr)
    '排序
    If Order = "SX" Then '升序
        Do
            OK = True
            For i = UBound(Arr) To j + 1 Step -1
                If Arr(i - 1) > Arr(i) Then
                    Temp = Arr(i - 1)
                    Arr(i - 1) = Arr(i)
                    Arr(i) = Temp
                    OK = False
                End If
            Next i
        Loop Until OK
    Else
        Do
            OK = True
            For i = UBound(Arr) To j + 1 Step -1
                If Arr(i - 1) < Arr(i) Then
                    Temp = Arr(i - 1)
                    Arr(i - 1) = Arr(i)
                    Arr(i) = Temp
                    OK = False
                End If
            Next i
        Loop Until OK
    End If
    排序 = Arr
End Function

回复

使用道具 举报

发表于 2010-4-9 15:51 | 显示全部楼层

对于小量数据,这个其实挺快了。再快也快不了多少。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-17 02:38 , Processed in 0.350855 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表