全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1290
推到 Plurk!
推到 Facebook!

Delphi可以寫一個比較準的樂透程式碼嗎? Part-II

答題得分者是:william
flyup
資深會員


發表:280
回覆:508
積分:385
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-24 17:02:28 IP:61.216.xxx.xxx 未訂閱
如何將此程式碼改為Delphi程式碼 哪種排序較快?VB可以多快? 以內部排序來比較,我只知道QuickSort演算法是最快的.(最壞O(n2) ,平均O(n log2n)),我不是資工的,沒歸納整理過每種排序的演算法效率,這裡實做出來的VB QuickSort, 在排序30,000筆整數時,使用我的AMD CPU(我忘了是哪一款型號,只記得是300MHZ) 的慢速電腦,大約1秒鐘,我想這應該符合大多數的需求了吧?如果還需要處理更多數量的排序方法,我建議丟給ADO,搞不好比自己寫的還要快... 我只用VB 6.0測試過, 沒試過改寫到VBScript的執行速度時會多快?要是有網友試驗過,麻煩給我一點情報,可以節省我一點時間. 利用ListBox/ComboBox的Sorted Property 上面的QuickSort,快是很快,可是還要用個array存放,有些情況就是挺麻煩的.況且,大部份的情況還需要新增/刪除某個Index, 從VB問世以來, 其實我很少自己排序.多半是利用ListBox或是ComboBox,設定了Property Sorted=True後,自然可以得到排序後的結果.真要排到...例如:10,000筆以上的話,通常早已先存放到外部的資料庫檔案,只要利用Index, 或者SQL Order by指令,也可以得到同樣效果. 原始程式(Quick Sort) 以下示範的QuickSort函數, 排序30,000個整數, 用AMD K6 300的CPU, 大約要一秒鐘. Option Explicit Private Sub Form_Load() Me.AutoRedraw = True End Sub Private Sub Command1_Click() Dim i% Dim vStart, vEnd Dim va(30000) Randomize For i = LBound(va, 1) To UBound(va, 1) va(i) = Int((30000 * Rnd) 1) Next i vStart = Now QuickSort va() vEnd = Now Me.Cls Me.Print "Elapsed Time:" Me.Print DateDiff("s", vStart, vEnd) & " second(s)" End Sub Private Sub QuickSort(va()) QSortRecursive LBound(va, 1), UBound(va, 1), va() End Sub Private Sub QSortRecursive(ByVal iFirst%, ByVal iLast%, va()) Dim i%, j% Dim v If iFirst < iLast Then i = iFirst 1 Do While va(i) < va(iFirst) i = i 1 If i > iLast Then Exit Do Loop j = iLast Do While va(j) > va(iFirst) j = j - 1 If j < iFirst Then Exit Do Loop Do While (i < j) v = va(i) va(i) = va(j) va(j) = v Do i = i 1 Loop While (va(i) < va(iFirst)) Do j = j - 1 Loop While (va(j) > va(iFirst)) Loop v = va(iFirst) va(iFirst) = va(j) va(j) = v QSortRecursive iFirst, j - 1, va() QSortRecursive j 1, iLast, va() End If End Sub
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-25 00:05:27 IP:210.3.xxx.xxx 未訂閱
TList has a built in quick sort method  < class="code">function MySort(p1,p2: pointer): integer begin if integer(p1)AList.Sort(MySort); finally AList.Free; end; end;
flyup
資深會員


發表:280
回覆:508
積分:385
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-26 00:13:06 IP:61.217.xxx.xxx 未訂閱
引言: TList has a built in quick sort method < class="code">function MySort(p1,p2: pointer): integer begin if integer(p1)AList.Sort(MySort); finally AList.Free; end; end;
可否有完整的程式說明,幫幫忙!
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-26 09:14:45 IP:147.8.xxx.xxx 未訂閱
引言:可否有完整的程式說明,幫幫忙!
AList.Sort(MySort); This is the main point. TList will perform a quick sort using the function MySort. MySort should be of type TListSortCompare and, TListSortCompare = function (Item1, Item2: Pointer): Integer; By implementing a proper function (Item1,Item2 are items inside TList), you can virtually perform a quick sort on anything. BTW, why does the "then" keyword disappear? I can see it is inside the quoted message?
系統時間:2024-05-03 8:35:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!