製作遊戲輔助?

什麼情況下會用到氣泡排序呢? 例如,學生考試成績的排列,財務部門支出清單的排序……等等。實現將一堆凌亂無序的東西,按照從大到小或者從小到大的順序排列好,同時也能得知其中的最大值和最小值。

今天呢,我們藉助遊戲中的拍賣行,來講解下如何用氣泡排序來實現。

工具/原料

按鍵精靈2014

方法/步驟

演算法原理:

氣泡排序(BubbleSort)

氣泡排序是最慢的排序演算法,但也是新手最容易上手的一個排序方法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每一個元素,使較大的資料下沉,較小的資料上升。它是O(n^2)的演算法。

演算法的複雜度

有沒有同學問,O(n^2)的演算法是什麼呢?這是其實是衡量演算法速度快慢的一個指標,我們稱之為演算法的時間複雜度。時間複雜越大,演算法的執行效率越低。

當然,並不是越快的演算法,一定越好。演算法還有另一個指標,叫空間複雜度,即算法佔用多少空間,這個和記憶體息息相關。一個演算法可能很快,但是它佔用的記憶體多,不一定耗得起。

所以呢在不同的場合,我們需要根據不同的要求,會選擇最合適的演算法。

如何計算時間複雜度

時間複雜度,其實就是演算法中某一語句迴圈執行的次數。

例如:氣泡排序法的原理

For i = 1 To n

For j = 1 To n

氣泡排序

Next

Next

這個演算法的時間複雜度,即“氣泡排序”這個語句的執行次數。

當i=1的時候,For j = 1 To n:氣泡排序:Next,“氣泡排序”這個語句被執行了n次。

當i=2的時候,For j = 1To n:氣泡排序:Next,“氣泡排序”這個語句又被執行了n次。

當i=3的時候,For j = 1To n:氣泡排序:Next,“氣泡排序”這個語句又被執行了n次。

……

當i=n的時候,For j = 1To n:氣泡排序:Next,“氣泡排序”這個語句又被執行了n次。

綜上,“氣泡排序”這個語句被執行了n個n次,即n*n=n^2次。所以氣泡排序的時間複雜度即為n^2,我們記為O(n^2)

注:1.如果演算法中語句執行次數為一個常數,則時間複雜度為O(1)。

2.若一個演算法的時間複雜度為O(n)=n^2+3n+4,我們只取算式中最高次方,即O(n^2)。

演算法的實現

製作遊戲輔助 :按鍵精靈排序演算法之冒泡法

演算法講解:

'氣泡排序

//經過n-1趟子排序完成的,它的時間複雜度為O(n^2)

//優點:1.程式碼簡單易懂;2.具有穩定性

1.獲取到物品價格,存入陣列su

2.獲取到陣列的個數,即物品的總數,記為M

3.迴圈開始

4.獲取到陣列su(0)的數值

5.su(0)與陣列中剩餘的數值對比(su(1)-su(M)),若數值大於su(0),則相互調換

6.Su(0)儲存陣列中最大的值

7.迴圈到陣列最後一個數值su(M)

8.結束第一次迴圈,陣列的第一個元素su(0)為陣列中最大值

9.從su(1) 到su(M),重複5-8步驟,實現su陣列最後為從大到小的降序排列。

程式碼具體實現:

Dim i,j

su= "105875 502150 411400 63525 111925 90750" //獲取到的物品價格

su=Split(su, " ")

M = UBound(su)

//升序排序

For i = 0 To UBound(su)-1 //i=0 的時候 j迴圈是從 1迴圈到陣列最小不 第一輪迴圈,su(0)和su (1)-su(5)進行比較 選擇6個數中最小的數放到su(0) 第二輪迴圈 su(1)和su(2)-su(5)比較

For j = i+1 to UBound (su)

If int(su(i)) > int (su(j)) Then // 陣列是字串的 所以需要用int改為數值型 否則會出現錯誤

tran = su(j)

su(j) = su(i)

su(i) = tran //如果前一個數比後一個數大,就交換位置

End If

Next

Next

// 降序排序

For i = 0 To UBound(su)-1

For j = i+1 to UBound (su)

If int(su(i))

tran = su(j)

su(j) = su(i)

su(i) = tran //如果後一個數比前一個數大,就交換位置

End If

Next

Next

程式碼的每一次實現

原陣列: "105875 502150 411400 63525 111925 90750"

第一次迴圈:

取su(0)的值105875,與su(1)對比。su(1)>su(0),則相互交換:

"502150 105875 411400 63525 111925 90750"

然後拿su(0)的值502150,與su(2)-su(5)對比,沒有比su(0)更大的值,不再交換,結束。

第一次迴圈結束:"502150 105875 411400 63525 111925 90750"

第二次迴圈:

取su(1)的值105875,與su(2)的值411400對比,su(2)>su(1),則相互交換:

"502150 411400 105875 63525 111925 90750"

然後拿su(1)的值411400,與su(3)-su(5)對比,沒有比su(1)更大的值,不再交換,結束。

第二次迴圈結束:"502150 411400 105875 63525 111925 90750"

第三次迴圈:

取su(2)的值105875,與su(3)的值63525對比,su(3) su(2),則相互交換:"502150 411400 111925 63525 105875 90750"

然後拿su(2)的值111925,與su(5)的值90750對比,su(5)

第三次迴圈結束:"502150 411400 111925 63525 105875 90750"

第四次迴圈:

取su(3)的值63525,與su(4)的值105875對比,su(4)>su(3),相互交換:

"502150 411400 111925 105875 63525 90750"

取su(3)的值105875,與su(5)對比,su(5)

第四次迴圈結束:"502150 411400 111925 105875 63525 90750"

第五次迴圈:

取su(4)的值63525,與su(5)的值90750對比,su(4)>su(5),相互交換,迴圈結束。

第五次迴圈結束:"502150 411400 111925 105875 90750 63525"

此時陣列已迴圈到最後,完成降序排列。

知識拓展

按數量級遞增排列,常見的時間複雜度有:

常數階O(1),對數階O(log2n),線性階O(n), 線性對數階O(nlog2n),平方階O(n2),立方階O(n3),..., k次方階O(nk),指數階O(2n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。

相關問題答案