日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Excel Excel VBA 數(shù)組排序

 藥都之鄉(xiāng) 2013-08-28


Excel VBA 數(shù)組排序
作者: parno

使用EXCEL的VBA編程時(shí),經(jīng)常會(huì)用到數(shù)組,有時(shí)需要對(duì)數(shù)組進(jìn)行排序,在這里介紹一下數(shù)字?jǐn)?shù)組排序的常用方法以及帶有EXCEL特色的函數(shù)排序方法(所舉例子均以升序排列數(shù)組)。

在介紹具體方法之前,先給個(gè)數(shù)組生成過(guò)程。(將數(shù)組a(1 to 50)定義成公用數(shù)組)

復(fù)制內(nèi)容到剪貼板 程序代碼
Sub MakeArr()
For i = 1 To 50
a(i) = Int(Rnd(1) * 890 + 10)
Next i
End Sub


1、快速排序法

復(fù)制內(nèi)容到剪貼板 程序代碼
Sub FastSort()
M = 1
For i = 1 To 49
If a(i) <= a(i + 1) Then
  If i > M Then
   M = i
  Else
   i = M
  End If
  GoTo kk:
Else
x = a(i)
a(i) = a(i + 1)
a(i + 1) = x
If i <> 1 Then i = i - 2
End If
kk:
Next i
End Sub


2、冒泡排序法

復(fù)制內(nèi)容到剪貼板 程序代碼
Sub BubbleSort()
    For i = 1 To 49
        For j = i + 1 To 50
            If a(i) > a(j) Then
                TEMP = a(j)
                a(j) = a(i)
                a(i) = TEMP
            End If
        Next j
    Next i
End Sub


3、桶排序法

復(fù)制內(nèi)容到剪貼板 程序代碼
Sub Bucket()
    Dim Index
    Dim tempnum
    For i = 2 To 50
        tempnum = a(i)
        Index = i
        Do
            If Index > 1 Then
                If tempnum < a(Index - 1) Then
                    a(Index) = a(Index - 1)
                    Index = Index - 1
                Else
                    Exit Do
                End If
            Else
                Exit Do
            End If
        Loop
        a(Index) = tempnum
    Next
End Sub


4、希爾排序法

復(fù)制內(nèi)容到剪貼板 程序代碼
Sub ShellSort()
    Dim skipnum
    Dim Index
    Dim i
    Dim tempnum
    Size = 50
    skipnum = Int((Size / 2)) - 1
    Do While skipnum > 0
        i = 1 + skipnum
        For j = i To 50
            Index = j
            Do
                If Index >= (1 + skipnum) Then
                    If a(Index) < a(Index - skipnum) Then
                        tempnum = a(Index)
                        a(Index) = a(Index - skipnum)
                        a(Index - skipnum) = tempnum
                        Index = Index - skipnum
                    Else
                        Exit Do
                    End If
                Else
                    Exit Do
                End If
            Loop
        Next
        skipnum = (skipnum - 1) / 2
    Loop
End Sub


5、選擇排序法

復(fù)制內(nèi)容到剪貼板 程序代碼
Sub SelectionSort()
    Dim Index
    Dim Min
    Dim i
    Dim tempnum
    BzArr
    i = 1
    While (i < 50)
        Min = 50
        Index = Min - 1
        While (Index >= i)
            If a(Index) < a(Min) Then
                Min = Index
            End If
            Index = Index - 1
        Wend
        tempnum = a(Min)
        a(Min) = a(i)
        a(i) = tempnum
        i = i + 1
    Wend
End Sub


以上五種排序方法均是數(shù)組排序的常用方法,優(yōu)點(diǎn)是不需借助輔助單元格。執(zhí)行效率視數(shù)組成員的相對(duì)有序性的不同而不同。以附件中的50位一維數(shù)組為例,快速排序法的循環(huán)次數(shù)是745次、冒泡法的循環(huán)次數(shù)是1225次、桶排序法的循環(huán)次數(shù)是704次、希爾排序法的循環(huán)次數(shù)是347次、選擇排序法的循環(huán)次數(shù)為1225次。

下面再介紹兩種用EXCEL函數(shù)的排序方法,一般來(lái)說(shuō)使用EXCEL自帶函數(shù)或方法的執(zhí)行效率會(huì)高一些,但限于函數(shù)參數(shù)的限制有的不得不借助于輔助單元格。

6、SMALL函數(shù)法

復(fù)制內(nèi)容到剪貼板 程序代碼
Sub SmallSort()
Dim b(1 To 50)
For i = 1 To 50
b(i) = Application.WorksheetFunction.Small(a, i)
Next
End Sub


原數(shù)組不變,生成一個(gè)新的按升序排列的數(shù)組。
同理也可以用LARGE函數(shù)。我個(gè)人覺(jué)得用這種方法較快。

7、RANK函數(shù)法

復(fù)制內(nèi)容到剪貼板 程序代碼
Sub RankSort()
    BzArr
    Dim b(1 To 50)
    For i = 1 To 50
        Sheet2.Cells(i, 1) = a(i)
    Next
    Set rankrange = Sheet2.Range("a1:a50")
    For i = 1 To 50
        For k = 0 To Application.WorksheetFunction.CountIf(rankrange, Sheet2.Cells(i, 1)) - 1
            j = Application.WorksheetFunction.Rank(Sheet2.Cells(i, 1), rankrange, 1)
            a(j + k) = Sheet2.Cells(i, 1)
        Next
    Next
    For i = 1 To 50
        Sheet1.Cells(i + 2, 7) = a(i)
    Next
End Sub


此方法的缺點(diǎn)是需要借助輔助單元格。當(dāng)然如果借助輔助單元格的話(huà)完全可以用EXCEL的排序功能,在這里就沒(méi)必要詳述了。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多