Re: 雙層排序問題

看板C_and_CPP (C/C++)作者 (software everywhere)時間16年前 (2009/06/24 01:59), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/6 (看更多)
※ 引述《yauhh (喲)》之銘言: : ※ 引述《aoaay (低調奢華簡約時尚)》之銘言: : : 不好意思 小弟新手 : : 最近遇到一個問題 : : 問題如下: : : 若英文字母的priority的大小如下BROYGLPW : : 要將12組資料依序排好: 先依priority,再依數值由小至大,將結果輸出至檔案. : : 結果檔案內容應如下: : : B 81 : : B 99 : : R 23 : : R 56 : : O 72 : : W 15 : : L 11 : : Y 55 : : O 78 : : W 89 : : P 98 : : G 56 : : 該如何寫 請板上大大教一下 給個方向 謝謝 這個問題滿好玩的 因為多層排序 在很多struct中 常常出現 通常 過了第一關(排兩層) 後面要排3 4 層都比較能接受 還有一個問題 如果排序方式 不是 依據原本的連續性 像是你給的 BROYGLPW 或是 中文的排序(用注音排) 都會有跳躍區間的情形 依據你給的問題 其實 "BROYGLPW" 是跳躍的prior 想像 你用下列結構去承接 typedef struct{ char ch; unsigned int prior; }S_CHAR_PRIOR_PAIR; 用資料庫的看法 這兩個欄位 都可以當key 你用 ch去查 一個特定 'B' 必定存在一組 也只能有一組 紀錄 用 prior = 1去查 結果亦同 所以 你用 "BROYGLPW" 和他的prior並行array <1,2,3,4,5,6,7,8> 來看 兩個是一樣的 but 最大的差別是 {1,2,3,4,5,6,7,8} 是嚴格遞增 所以用 array 對回 ch 是 O(1) 但是 "BROYGLPW" 並不連續 所以頂多用我之前敲過的 compiling-time fixed array -> poweron-time qsort -> run-time bsearch 降到 O(logN) --------------------------------------------------------------------- 假設 你接一組 <'B',81> 用的是 typedef struct{ char ch; int value; }S_CHAR_VAL_PAIR; 字母比對 自行實作 int getPrior_byChar( char ch ); //如果覺得麻煩 就用線性search吧 cmp func: int cmp_byChVal( const void *pL, const void *pR){ int pr1 = getPrior_byChar( ((S_CHAR_PRIOR_PAIR*)pL)->ch ); int pr2 = getPrior_byChar( ((S_CHAR_PRIOR_PAIR*)pR)->ch ); int res=0; if ( (res=pr1-pr2)!=0 ) return res; return ((S_CHAR_PRIOR_PAIR*)pL)->value - ((S_CHAR_PRIOR_PAIR*)pR)->value; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.121.159
文章代碼(AID): #1AGHWDQS (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
3
6
以下文章回應了本文
完整討論串 (本文為第 3 之 6 篇):
5
23
1
1
3
6
2
27
文章代碼(AID): #1AGHWDQS (C_and_CPP)