各位老朋友...好久不見了<(_ _)>在撰寫程式的時後,有時候我們會有需要將一大筆資料進行排序.最簡單的方法當然是氣泡排序法....不過偶爾也有到因為氣泡排序法的速度問題而改用其它排序法的時候不知道在這裡出沒的各位高手們 在這種狀況下會採用怎樣的排序法呢???可以的話....請順便說明一下排序的方法吧 ^^不需要程式......演算方法和概念就夠了 ^^(千萬不要回我 用快排就好..就算是快排...演算似乎也不只一種)
2006-06-26 07:49:40 · 6 個解答 · 發問者 ? 5 in 電腦與網際網路 ➔ 程式設計
不知道知識+的階級計算機制會不會影響到大家答題的意願
2006-06-26 07:54:53 · update #1
感謝 憂鬱的貢丸湯大大的說明....
不過那個sample Code是錯的.....會有資料漏排的情況
(這或許是網路上的東西並不一定正確的證明吧)
但它的演算法與我所會的不同.....還蠻有參考價值的
感謝 ^^
2006-06-27 06:07:12 · update #2
感謝Liu-Liu大的回答
由兩邊逐漸往中間作排序的方法我還沒看過呢......
研究研究 ^^
2006-07-04 04:10:17 · update #3
不知道怎麼做說明,乾脆寫程式囉:Option ExplicitPrivate Sub Form_Activate() Dim num() Dim myMax As Integer Dim myMin As Integer Dim myMaxIndex As Integer Dim myMinIndex As Integer Dim i As Integer Dim j As Integer Dim temp As Integer Randomize Timer ReDim num(9) For i = 0 To 9 num(i) = Int(Rnd * 1000) + 1 Next For i = 0 To Val(IIf(UBound(num) Mod 2 = 0, Int(UBound(num) / 2) - 1, Int(UBound(num) / 2))) For j = i To UBound(num) - i If i = j Then myMax = num(j) myMin = num(j) myMaxIndex = j myMinIndex = j Else If num(j) > myMax Then myMax = num(j) myMaxIndex = j End If If num(j) < myMin Then myMin = num(j) myMinIndex = j End If End If Next If num(i) <> myMax Then If num(i) = myMin Then myMinIndex = myMaxIndex temp = num(i) num(i) = num(myMaxIndex) num(myMaxIndex) = temp End If If num(UBound(num) - i) <> myMin Then temp = num(UBound(num) - i) num(UBound(num) - i) = num(myMinIndex) num(myMinIndex) = temp End If Next For i = 0 To UBound(num) Print num(i) NextEnd Sub
2006-07-04 21:15:01 補充:
我通常排序都是用
For x = 1 to n - 1
For y = x + 1 to n
If ... 交換
Next
Next
做資料排序,因為你問到這題,連續想了幾天,就想到這個做法了。
2006-07-01 14:01:17 · answer #1 · answered by 世賢 7 · 0⤊ 0⤋
我不是玉,但是很樂意跟各位大大一同討論~ ^_^小弟平常最常用的大概就是泡泡排序(Bubble Sort) 和快速排序(Quick Sort)。泡泡排序法的特色是程式碼簡單,但對於大量數字的排序速度慢。它所花費的時間是和個數的平方成正比。如果待排序的資料個數n小於某個範圍時,泡泡排序的效率有可能會較快速排序來得快。例如以統計學生成績來講,統計一個班的成績便適用泡泡排序法,因為通常學生都在五十人上下。但是假使要統計的一整個年級的成績,或是要以學號作為索引,把全校數千名學生列在一起,這時就最好要用快速排序了,因為數量會變得比較大。如果全校有五千名學生,用泡泡排序就得耗上五千的平方次迴圈,怎麼算都不划算。快速排序法是建立在「大而化之」的演算基礎上,由於概念不難,程式碼也不複雜,相當適合作為初學者或是一般使用。它的原理是:先取出一個中間數,將所有比它小的元素都放到左邊,較大的放右邊,再從左半邊的元素中選出一個中間數,較小的置其左,較大的置其右.....如此不斷的切割、分邊下去,一直分到只剩二個,沒有中間數了;最後再拼回來就完成排序了,用的是遞迴的結構。虛擬程式碼示意如下:Private Sub Quick_Sort(Byval A(n) as Integer) Dim n , high , low , pivot If high > low then Partition(low, high, pivot) Quick_Sort(low, pivot-1) Quick_Sort(piovt+1, high) End If 用遞迴來寫的好處是程式碼簡潔,缺點則是遞迴本身會耗用大量記憶體來作為Stack之用,嚴重時甚至可能產生溢位的問題。這裡有一段sample code 可以參考:http://cpatch.org/siva/document/vbweb/quicksort.htm排序法是一門高深的學問,也是一個很好用的工具,真的要談的話,是可以出一本書的;小弟在此就不贅述;比較常見的排序法尚有:一、Insertion sort (插入排序法) 二、Selection sort (選擇排序法) 三、Merging sort (合併排序法) 四、Counting sort (計數排序法) 五、Radix Sort (基底排序法) 六、Shell Sort (謝耳排序法)End Sub
2006-06-26 23:30:14 補充:
對了,如同Phoenix大大所說,開始使用.NET之後,若是狀況允許,小弟就比較傾向使用內建的SortMethod.
基本上如果真的講究效能的話,自己再怎麼optimize也快不過語言內建的~~~
2006-06-26 19:24:23 · answer #2 · answered by 憂鬱的貢丸湯 5 · 0⤊ 0⤋
色小鬼.好久不見你又浮出來了^^
2006-07-04 18:26:23 補充:
我跟Phoenix大大一樣,只會氣泡排序法而已XD,剛剛寫了一個測試出來比氣泡還慢,就不敢拿出來丟人現眼了.
2006-06-26 13:33:09 · answer #3 · answered by W.J.S. 7 · 0⤊ 0⤋
對於非本科系的我來說,我只會實作氣泡排序法,其他排序演算法都不懂
所以使用排序法就非常的懶,
目前都是直接使用語言內建的排序法來進行排序,或者使用資料庫的排序功能來進行排序@@
2006-06-26 09:19:53 · answer #4 · answered by Phoenix 5 · 0⤊ 0⤋
那就很遺憾了.....
2006-06-26 18:00:23 補充:
我沉很久囉....老色鬼 @@
2006-06-26 08:51:20 · answer #5 · answered by ? 5 · 0⤊ 0⤋
會影響喔!!哈哈哈:D
2006-06-26 08:44:43 · answer #6 · answered by ? 4 · 0⤊ 0⤋