RT,想請教一下關于VFP實作并歸排序演算法的問題。
根據在百度找到的提示,我自己寫了一個并歸排序的實作Demo。
但是在與BubbleSort比較的時候發現,MergeSort花費的時間幾乎是BubbleSort的2.5倍。
但是從理論上來說MergeSort的效率應該是遠超BubbleSort的。
以下貼上代碼與截圖,還請版主大大們與各路大神不吝賜教,再次謝過各位了。
LOCAL lnTemp,lnArrlen,lcarrNo,lcBubbletime,lcMergetime
lnArrlen = 5000
CLEAR
**Get Array
DIMENSION arr(lnArrlen)
FOR i = 1 TO lnArrlen
arr(i) = ROUND(rand()*lnArrlen*10,0)
ENDFOR
ACOPY(arr,originalArr)
**Bubble Sort
T1 = SECONDS()
FOR i = 1 TO lnArrlen
FOR j = i + 1 TO lnArrlen
IF arr(i) > arr(j)
lnTemp = arr(i)
arr(i) = arr(j)
arr(j) = lnTemp
ENDIF
ENDFOR
ENDFOR
T2 = SECONDS()
lcBubbletime = 'BubbleSort用時: '+ALLTRIM(STR(T2-T1,10,3))+'秒'
**Recovery
ACOPY(originalArr,arr)
**Merge Sort
T1 = SECONDS()
FOR i = 1 TO lnArrlen
lcarrNo = ALLTRIM(STR(i))
DIMENSION arr&lcarrNo(1)
arr&lcarrNo(1) = arr(i)
ENDFOR
DIMENSION arrNow(lnArrlen)
arrNow(1) = arr1(1)
FOR i = 1 TO lnArrlen - 1
lcarrNo = ALLTRIM(STR(i))
isAdd = .F.
FOR j = 1 TO i
IF arrNow(j) > arr&lcarrNo(1)
AINS(arrNow,j)
arrNow(j) = arr&lcarrNo(1)
j = i + 1
isAdd = .T.
ENDIF
ENDFOR
IF !isAdd
AINS(arrNow,j)
arrNow(j) = arr&lcarrNo(1)
ENDIF
ENDFOR
T2 = SECONDS()
lcMergetime = 'MergeSort用時: '+ALLTRIM(STR(T2-T1,10,3))+'秒'
**Result
MESSAGEBOX('共'+ALLTRIM(STR(lnArrlen))+'個數'+ CHR(13) +lcBubbletime + CHR(13) + lcMergetime,48,'Tip')
uj5u.com熱心網友回復:
此問題轉戰這邊了!問樓主一個問題,兩個演算法為何風格如此不一樣?一個有宏一個沒有,這還能比么?
uj5u.com熱心網友回復:
肯定不一樣啊,本質上的區別,理論上說并歸的效率應該是冒泡的上萬倍
uj5u.com熱心網友回復:
就問一下樓主學過資料結構沒有?時間復雜度的計算,主要是考慮藥費時間多的操作,而宏的花費時間應該是非常多,所以在追求效率的程式中不應該使用宏操作!如果非常在意效率,應該使用非VFP語言(因為VFP本身就是低速的)甚至是匯編!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/88005.html
標籤:VFP
下一篇:redhat 7.3安裝mysql【服務器不能聯網】遇到Glibc.so.6(LIBC_2.14)(64bit) is needed by
