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

排序並求出排名

尚未結案
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-20 15:36:09 IP:140.124.xxx.xxx 未訂閱
想請問一下各位大大 我的問題是假設我有一陣列list[]={84,90,85,73} 如果是使用泡沫排序法得出結果將為{73,84,85,90} 問題是如何得知排名,例如90為最大值,原先為排名二=>最後排序後為4 84原先排名為1=>最後排名為2,以此類推。 煩請各位大大給我一點想法。
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-20 17:23:12 IP:59.115.xxx.xxx 未訂閱
Kioarena 您好:    我不確定有沒有誤解您的意思?如果您是要列出排序後的名次的話,可參考一下下列作法:
int list[] = {84, 90, 85, 73};
//... 此處執行排序動作 ....
int cnt = sizeof(list)/sizeof(int);
for (int i=cnt-1; i>=0; i--) {
    Memo1->Lines->Add("第 " IntToStr(cnt-i) " 名:" IntToStr(list[i]));
}
7 天天敲鍵盤 v 時時按滑鼠 8
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-20 18:39:43 IP:210.202.xxx.xxx 未訂閱
RedSnow大大, 我想Kioarena是想得知 原本資料陣列的索引值才對; 所以應該 用另一個相等的空陣列來存放排序後的 結果, 再與原資料陣列作比對才會知道 原本的索引值. 不知對不對.
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-20 18:40:23 IP:140.124.xxx.xxx 未訂閱
很抱歉,可能我說的不是很清楚。 舉個ex.list[]={84,90,85,73} list[0]=84 對應初始rank=1 list[1]=90 對應初始rank=2 list[2]=85 對應初始rank=3 list[3]=73 對應初始rank=4 -------------------------------------- 排序結束 list[0]=73,list[1]=84,list[2]=85,list[3]=90 84從a[0]變到a[1]所以原本rank從1變成2 73從a[3]變到a[0]所以原本rank從4變成1 也就是一開始是按照維度順序給定rank,最後得到排序後,再給定排名
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-20 22:48:12 IP:59.115.xxx.xxx 未訂閱
Kioarena 您好:    呵呵~我有點不敢回覆了....< >是這樣子嗎?還是我又會錯意了....< >
int list[] = {84, 90, 85, 73};
int cnt = sizeof(list) / sizeof(int);    Memo1->Lines->Add("排序前:");
for(int i=0; iLines->Add("list[" IntToStr(i) "] = " IntToStr(list[i]) " rank = " IntToStr(i 1));
}    //... 此處執行排序動作 ....    Memo1->Lines->Add("排序後:");
for(int i=0; iLines->Add("list[" IntToStr(i) "] = " IntToStr(list[i]) " rank = " IntToStr(i 1));
}
7 天天敲鍵盤 v 時時按滑鼠 8
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-20 23:13:25 IP:61.228.xxx.xxx 未訂閱
看來我的問題好像不大好理解, 也不曉得該用何種方式形容會更好。 希望有大大能夠再給我一點啟發
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-20 23:44:31 IP:210.202.xxx.xxx 未訂閱
To RedSnow :       怎會發生這種事呢? 看似簡單的問題, 卻無法符合 發表人的題意.
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-21 00:16:58 IP:59.115.xxx.xxx 未訂閱
derrenbol1 您好:    我也很納悶,所以我才會說我有點不敢回覆了....,照理說問題應該不會是那麼簡單的,但是我從 Kioarena 的字面說明來看,就只能理解到那個地方,可能是我又碰上盲點了吧....。        Kioarena 您好:    您看看可不可以用圖並配合文字描述來表示您所想要的結果,或許這樣子比較容易弄清楚。      7 天天敲鍵盤 v 時時按滑鼠 8
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-21 19:00:34 IP:61.228.xxx.xxx 未訂閱
譬如說在excel裡面,有五筆資料 95 88 33 45 75 =============== excel好像可在不變動資料位置,就可以做出排名 95 排名=1 88 排名=2 33 排名=5 45 排名=4 75 排名=3 我的構想應該可以說是這樣,在不變動資料位置的情況下,得出他們的排名。 不曉得這樣對不對,能不能理解。
haman
中階會員


發表:46
回覆:137
積分:56
註冊:2005-03-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-21 19:09:58 IP:211.76.xxx.xxx 未訂閱
引言: 很抱歉,可能我說的不是很清楚。 舉個ex.list[]={84,90,85,73} list[0]=84 對應初始rank=1 list[1]=90 對應初始rank=2 list[2]=85 對應初始rank=3 list[3]=73 對應初始rank=4 -------------------------------------- 排序結束 list[0]=73,list[1]=84,list[2]=85,list[3]=90 84從a[0]變到a[1]所以原本rank從1變成2 73從a[3]變到a[0]所以原本rank從4變成1 也就是一開始是按照維度順序給定rank,最後得到排序後,再給定排名
你指的是排序結束 list[0]=73,list[1]=84,list[2]=85,list[3]=90 84從a[0]變到a[1]所以原本rank1的內容變成rank2的內容 73從a[3]變到a[0]所以原本rank4的內容變成rank1的內容 嗎?? 如果是這樣的話你在排序時就可以一起做了 借用一下RedSnow大大的code...cc
int list[] = {84, 90, 85, 73};
//... 此處執行排序動作 ....
//對調的地方改成
              int iTmp = list[i];
              list[i] = list[i 1];
              list[i 1] = iTmp;
              String strTmp = rank[i 1];
              rank[i 1] = rank[i 2];
              rank[i 2] = strTmp;
//...    int cnt = sizeof(list)/sizeof(int);
for (int i=cnt-1; i>=0; i--) {
    Memo1->Lines->Add("第 " IntToStr(cnt-i) " 名:" IntToStr(list[i]));
}
haman
中階會員


發表:46
回覆:137
積分:56
註冊:2005-03-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-21 19:20:54 IP:211.76.xxx.xxx 未訂閱
原來我也猜錯了@@" 如果單純用陣列來做的話list跟rank之間應該是沒有關係的吧? 如果要達到你的目的的話, 試試將排出來的i存到另一個陣列裡 ex list[]={84,90,85,73} 排出來的i應該是 dym_rank={1,2,0,3} 再以dym_rank裡的值去showlist跟rank 這樣的話兩個陣列就都沒動到了
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-09-21 20:36:33 IP:210.202.xxx.xxx 未訂閱
To Kioarena :      那我覺得您連排序都省了, 提供一個更沒效率的方法給客倌您看看: class="code"> for( i = 0 ; i < cnt ; i ) { rank = 1; for( j = 0 ; j < cnt ; j ) if((i!=j)&&(list[j]>list[i])) rank ; Memo1->Lines->Add(IntToStr(list[i]) " 排名== " IntToStr(rank)) } 這種方式很像索引值排序, 但針對每個元素再從頭找起. 發表人 - derrenbol1 於 2005/09/21 20:46:26
Kioarena
一般會員


發表:3
回覆:12
積分:3
註冊:2005-03-02

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-21 20:46:08 IP:61.228.xxx.xxx 未訂閱
真是感謝各位給我這摸多想法, 我想最後haman大大提供的方法正是我想使用的, 而derrenboll的方法也可以算到我要的答案, 不過因為我是要使用排序做另外的功用, 所以我就給分給haman了。 可能我自己也一直被自己的想法搞糊塗,所以呈現問題呈現的不好, 不過還是謝謝大家,往後有問題還盼各位多幫忙。謝謝
系統時間:2024-05-18 7:16:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!