Re: 排序問題

看板Perl作者 (零式札克)時間18年前 (2006/10/22 18:33), 編輯推噓5(503)
留言8則, 4人參與, 最新討論串3/4 (看更多)
※ 引述《wawawa (哇哇哇○( ̄﹏ ̄)○)》之銘言: : ※ 引述《ncukcm (test)》之銘言: : : 我有一筆資料每一行的格式為 : : S(字串) X Y Z A B C (以上皆為數字) : : 需要將這些資料重新排序然後再印出資料 : : 先依 Z 大小再依 X 大小再依 Y 大小 : : 想請教該如何寫比較好呢 ? : 好久沒寫perl了...練習一下:p 應該沒寫錯(吧?) : 在這裡假設你的資料檔名是test.txt... : #!/usr/bin/perl : sub by_order { : (split /\s+/, $a)[3] <=> (split /\s+/, $b)[3] or : (split /\s+/, $a)[1] <=> (split /\s+/, $b)[1] or : (split /\s+/, $a)[2] <=> (split /\s+/, $b)[2]; : } : open TXT, "< test.txt"; : @content = <TXT>; : close TXT; : foreach ( sort by_order @content ) { : print; : } 這個方法確實可行 但是最大的缺點在於 多次的 split 造成效率上的問題 ( Perl 使用 qsort 演算法, NlogN 的複雜度下每次都要執行 sort function 做比較 ) 正巧在書裡看到 "Perl設技師對於複雜排序問題的標準解法" 又稱 Schwartz 轉換, 解法很巧妙, 對於這個問題的寫法 我把它列在下面 :p my @a = ( "abc 1 6 3 1 5 6", # data input "def 2 5 5 1 8 3", "ghi 4 7 2 0 8 9", "jkl 4 5 5 1 8 2", "mno 2 7 5 1 8 9", "pqr 1 6 5 1 8 3" ); @a = map{ $_->[ 0 ] } # 轉回 sort{ $a->[ 4 ] <=> $b->[ 4 ] or # 排序 $a->[ 2 ] <=> $b->[ 2 ] or $a->[ 3 ] <=> $b->[ 3 ] } map{ [ $_, split ] } @a; # 轉換 像這樣, @a 的內容就排序完成了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.216.170.17

10/22 18:55, , 1F
蠻有趣的!!
10/22 18:55, 1F

10/23 09:56, , 2F
可以請教一下是哪本書嗎? 謝謝:)
10/23 09:56, 2F

10/23 11:23, , 3F
Internet XD
10/23 11:23, 3F

10/23 11:24, , 4F
請辜狗"GRT Sort" GRT是比ST更好用的轉換 ^^
10/23 11:24, 4F

10/24 00:00, , 5F
Effective Perl programming, 有中文版 :p
10/24 00:00, 5F

10/24 00:00, , 6F
話說 GRT 真是太讚啦 更容易懂 而且更有效率 :p
10/24 00:00, 6F

10/24 00:11, , 7F
感謝告知 ~
10/24 00:11, 7F

10/24 07:28, , 8F
感謝分享!
10/24 07:28, 8F
文章代碼(AID): #15EqZTA5 (Perl)
討論串 (同標題文章)
本文引述了以下文章的的內容:
1
1
18年前, 10/19
以下文章回應了本文
完整討論串 (本文為第 3 之 4 篇):
5
8
1
1
18年前, 10/19
18年前, 10/19
文章代碼(AID): #15EqZTA5 (Perl)