国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
多種算法VB版
  • 首先,在計算機編程中排序是一個經(jīng)常遇到的問題。數(shù)據(jù)只有經(jīng)過排序后,才更有意義。其次,排序算法說明了許多重要的算法的技術(shù),例如二進制細分,遞歸和線性添加。最后要說明的一點是不同的算法有不同的優(yōu)缺點,沒有一種算法在任何情況下都是最好的算法。

    汽泡排序法

    該算法是專門針對已部分排序的數(shù)據(jù)進行排序的一種排序算法。如果在你的數(shù)據(jù)清單中只有一兩個數(shù)據(jù)是亂序的話,用這種算法就是最快的排序算法。如果你的數(shù)據(jù)清單中的數(shù)據(jù)是隨機排列的,那么這種方法就成了最慢的算法了。因此在使用這種算法之前一定要慎重。
  • 這種算法的核心思想是掃描數(shù)據(jù)清單,尋找出現(xiàn)亂序的兩個相鄰的項目。當(dāng)找到這兩個項目后,交換項目的位置然后繼續(xù)掃描。重復(fù)上面的操作直到所有的項目都按順序排好。
  • 圖1是對這種算法的說明。在該例中,數(shù)字1的未按順序排好。第一次掃描清單時,程序找到4和1是兩個相鄰的亂序項目,于是交換它們的位置。以此類推,直到將所有的項目按1234排好。數(shù)字1就象上升的汽泡一樣,這就是這一算法名稱的由來。
  • 2 2 2 1
    3 3 1 2
    4 1 3 3
    1 4 4 4
    圖1.
  • 你可以改進該算法,讓程序自下而上開始掃描,這樣只須一次就能排好順序了。
  • 下面是用VB代碼實現(xiàn)這一算法的例子:
  • ' min and max are the minimum and maximum indexes
    '
     of the items that might still be out of order.
    Sub BubbleSort (List() As LongByVal min As Integer, _
        
    ByVal max As Integer)
    Dim last_swap As Integer
    Dim i As Integer
    Dim j As Integer
    Dim tmp As Long

        
    ' Repeat until we are done.
        Do While min < max
            
    ' Bubble up.
            last_swap = min - 1
            
    ' For i = min + 1 To max
            i = min + 1
            
    Do While i <= max
                
    ' Find a bubble.
                If List(i - 1> List(i) Then
                    
    ' See where to drop the bubble.
                    tmp = List(i - 1)
                    j 
    = i
                    
    Do
                        List(j 
    - 1= List(j)
                        j 
    = j + 1
                        
    If j > max Then Exit Do
                    
    Loop While List(j) < tmp
                    List(j 
    - 1= tmp
                    last_swap 
    = j - 1
                    i 
    = j + 1
                
    Else
                    i 
    = i + 1
                
    End If
            
    Loop
            
    ' Update max.
            max = last_swap - 1

            
    ' Bubble down.
            last_swap = max + 1
            
    ' For i = max - 1 To min Step -1
            i = max - 1
            
    Do While i >= min
                
    ' Find a bubble.
                If List(i + 1< List(i) Then
                    
    ' See where to drop the bubble.
                    tmp = List(i + 1)
                    j 
    = i
                    
    Do
                        List(j 
    + 1= List(j)
                        j 
    = j - 1
                        
    If j < min Then Exit Do
                    
    Loop While List(j) > tmp
                    List(j 
    + 1= tmp
                    last_swap 
    = j + 1
                    i 
    = j - 1
                
    Else
                    i 
    = i - 1
                
    End If
            
    Loop
            
    ' Update min.
            min = last_swap + 1
        
    Loop
    End Sub
  • 選擇排序法 選擇排序法是一個很簡單的算法。其原理是首先找到數(shù)據(jù)清單中的最小的數(shù)據(jù),然后將這個數(shù)據(jù)同第一個數(shù)據(jù)交換位置;接下來找第二小的數(shù)據(jù),再將其同第二個數(shù)據(jù)交換位置,以此類推。下面是VB代碼實現(xiàn)該算法。
  • Sub Selectionsort (List() As Long, min As Integer, _
        max 
    As Integer)
    Dim i As Integer
    Dim j As Integer
    Dim best_value As Long
    Dim best_j As Integer

        
    For i = min To max - 1
            best_value 
    = List(i)
            best_j 
    = i
            
    For j = i + 1 To max
                
    If List(j) < best_value Then
                    best_value 
    = List(j)
                    best_j 
    = j
                
    End If
            
    Next j
            List(best_j) 
    = List(i)
            List(i) 
    = best_value
        
    Next i
    End Sub
  • 當(dāng)尋找第I小的數(shù)據(jù)時,你必須檢查N-I個項目,所以這一算法所用的步驟可用下面這個公式求得。
  •     N + (N - 1) + (N - 2) + ... + 1 = N * (N + 1) / 2
  • 選擇排序法適用于較少數(shù)據(jù)的排序。此外由于算法較簡單,因此他的代碼也比較簡單,這就為我們維護代碼帶來了方便。實際上如果你的數(shù)據(jù)相當(dāng)少的話,這種算法的速度快過其它更復(fù)雜的算法。

    快速排序法

    快速排序法對于大量數(shù)據(jù)的排序特別有用。其基本原理是:首先檢查數(shù)據(jù)列表中的數(shù)據(jù)數(shù),如果小于兩個,則直接退出程序。如果有超過兩個以上的數(shù)據(jù),就選擇一個分割點將數(shù)據(jù)分成兩個部分,小于分割點的數(shù)據(jù)放在一組,其余的放在另一組,然后分別對兩組數(shù)據(jù)排序。
  • 通常分割點的數(shù)據(jù)是隨機選取的。這樣無論你的數(shù)據(jù)是否已被排列過,你所分割成的兩個字列表的大小是差不多的。而只要兩個子列表的大小差不多,該算法所需的步驟就是N * log(N)步。對于使用比較法進行排序的算法來講這是最快的方法。下面是用VB代碼實現(xiàn)這一算法的例子。
  •  
  • 前面提到過,對于使用比較法作為算法基礎(chǔ)的算法來說,最快需N * log(N)步才能完成排序。計數(shù)排序法不作用比較,所以它不受此限制。實際上該算法是如此之快,以致于你會認為是使用了魔術(shù),而不是數(shù)學(xué)運算來排序。
  • 另一方面,計數(shù)排序法只能用于特殊的情況。首先,所有的要進行排序的數(shù)據(jù)必須是整數(shù),不能對字符使用該算法;其次,數(shù)據(jù)的范圍有限,如果你的數(shù)據(jù)是在1到1000之內(nèi),用這種算法的效果就非常好,但如果你的數(shù)據(jù)是在1到30000之間,該算法就根本不能用。
  • 首先該算法創(chuàng)建一個整數(shù)類型的臨時數(shù)組,該數(shù)組的上下標(biāo)分別是要排序的數(shù)據(jù)的最大最小值。如果數(shù)據(jù)列表的最大最小值從min_item到max_item, 該算法就將數(shù)組創(chuàng)建成下面這樣:
        Dim Counts() As Integer

        
    ReDim Counts(min_item To max_item)
    接下來,算法檢查列表中的每一個項目,并增加對應(yīng)該項目的數(shù)組元素的值,當(dāng)這一階段完成后,Counts(I)的數(shù)值就是就是數(shù)值為I的基礎(chǔ)上的個數(shù)。
        For I = min To Max
            Counts(List(I)) 
    = Counts(List(I)) + 1
        
    Next I
    程序掃描Counts數(shù)組,將counts轉(zhuǎn)換成被排序列表中的偏移量。
        next_spot = 1
        
    For i = min_value To max_value
            this_count 
    = counts(i)
            counts(i) 
    = next_spot
            next_spot 
    = next_spot + this_count
        
    Next i
    最后將數(shù)據(jù)進行排序

    下面是實現(xiàn)該算法的VB代碼

  • Sub Countingsort (List() As Long, sorted_list() As Long, _
        min 
    As Integer, max As Integer, min_value As Long, _
        max_value 
    As Long)
    Dim counts() As Integer
    Dim i As Integer
    Dim this_count As Integer
    Dim next_offset As Integer

        
    ' Create the Counts array.
        ReDim counts(min_value To max_value)

        
    ' Count the items.
        For i = min To max
            counts(List(i)) 
    = counts(List(i)) + 1
        
    Next i

        
    ' Convert the counts into offsets.
        next_offset = min
        
    For i = min_value To max_value
            this_count 
    = counts(i)
            counts(i) 
    = next_offset
            next_offset 
    = next_offset + this_count
        
    Next i

        
    ' Place the items in the sorted array.
        For i = min To max
            sorted_list(counts(List(i))) 
    = List(i)
            counts(List(i)) 
    = counts(List(i)) + 1
        
    Next i
    End Sub

     

  • 總結(jié)

    下表是各種算法的優(yōu)缺點比較,正如你所見到的那樣,每種算法只是在某一情況下表現(xiàn)得最好,下面是選擇算法時的一些原則:
    • 如果你的數(shù)據(jù)列表中有99%數(shù)據(jù)已排過序,則用汽泡排序法。
    • 如果你要排序的數(shù)據(jù)較少(100個以下),則用選擇排序法。
    • 如果你的數(shù)據(jù)都是整數(shù),并且數(shù)值不大(幾千以內(nèi)),則用計數(shù)排序法。
    • 否則的話用快速排序法法
  • 算法 優(yōu)點 缺點
    汽泡排序法 對以初步排序的數(shù)據(jù)來說這種方法的速度很快 在其它情況下運行速度較慢
    選擇排序法 非常簡單 對大量數(shù)據(jù)的排序速度很慢
    容易明白
    對于少量數(shù)據(jù)的排序來說速度很快
    快速排序法 對大量數(shù)據(jù)的排序來說速度很快 如果有大量重復(fù)的數(shù)據(jù)就比較麻煩
    計數(shù)排序法 當(dāng)數(shù)據(jù)數(shù)值較小(1-1000之間)時,速度非???/td> 當(dāng)數(shù)據(jù)數(shù)值較大時,速度較慢
    需額外的內(nèi)存
    只能對整數(shù)類型的數(shù)據(jù)排序
  • 本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
    打開APP,閱讀全文并永久保存 查看更多類似文章
    猜你喜歡
    類似文章
    Excel VBA數(shù)組通俗教程(初稿)
    VB中的數(shù)據(jù)結(jié)構(gòu)使用
    VB愛好者樂園(VBGood)算法設(shè)計全排列的生成算法
    VBA中四種常見排序算法的實現(xiàn)
    ArcGIS中屬性表操作示例
    如果同時聲明多個變量
    更多類似文章 >>
    生活服務(wù)
    分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
    綁定賬號成功
    后續(xù)可登錄賬號暢享VIP特權(quán)!
    如果VIP功能使用有故障,
    可點擊這里聯(lián)系客服!

    聯(lián)系客服