作者loveme00835 (朴髮箍)
看板C_and_CPP
標題Re: [問題] qsort的問題
時間Fri Apr 15 04:14:09 2011
※ 引述《Rpdk (Rpdk)》之銘言:
: 各位好
: 我算是一個初新手..
: 以前在解決作業 關於 sort 問題
: 都會使用 stdlib.h 裡的 qsort
: 但今天我的資料像是 二維資料
: 1 3 2 5 4 7 6
: 10 15 11 2 10 1 1
: 我的第一行 算是 index
: 希望排序後會像這樣
: 1 2 3 4 5 6 7
: 10 11 15 10 2 1 1
: 有辦法 利用 qsort 完成我需要的結果嗎?
: compare 不知道要怎麼寫...
: 感謝
在選擇資料儲存方式時, 必須依照幾種型態的特性去做衡量
1.array :
同質型態元素的集合, 用索引識別彼此
2.struct :
異質型態元素的集合, 用名稱識別彼此, 所佔
記憶體互斥.
3.union : 同上, 不過記憶體共享
當你說某一欄是當索引使用, 那麼很抱歉; 「這整個二維陣列的每
個元素都該當索引! 」
實作上也有徵狀可以指出你的儲存方式需要改進, 以初學者常寫的
「學生分數計算程式」為例:
#define STUDENT_COUNT 10
#define NAME_LENGTH 15
int ids[ STUDENT_COUNT ];
char names[ STUDENT_COUNT ][ NAME_LENGTH + 1 ];
float grades[ STUDENT_COUNT ];
// 其他程式碼...
swap_ids( &ids[ 0 ], &ids[ 2 ] );
swap_names( &names[ 0 ], &names[ 2 ] );
swap_grades( &grades[ 0 ], &grades[ 2 ] );
這支程式有以下的問題:
1.沒有任何學生出現, 你只有看到「一堆id、一堆name、一堆
grade」
2.重複的程式碼過多, 如交換的部份
3.同上, 雖然沒有明寫, 但程式中有限定ids[i]、names[i]
、grades[i]要視為一個整體
這就好像你把多個人各砍成三塊, 然後硬說 A的身體要裝在 B的腳
上面, 只因為它們膚色相同...
如果改成這樣:
// 不只標出有 3種資料要做處理, 更指明他們一定要視為一整體
struct Student
{
int id;
char name[ NAME_LENGTH + 1 ];
float grade;
};
struct Student students[ STUDENT_COUNT ];
swap_students( &students[ 0 ], &students[ 2 ] );
不只程式碼簡潔, 甚至連中括號都可以消去一大半! 再來回到原問
題, 儲存方式如果改成:
// 把索引拿出來作個區隔, 並規定它是非負整數
struct Instance
{
size_t index;
int value;
};
排序變得很簡單:
http://codepad.org/KcGFppsG
如果效率是重要的考量:
http://codepad.org/tEpQwQsC
綜合原文 a 大的作法:
http://codepad.org/zl5EWzgM
如果熟悉了以上的用法, 基本上連二維陣列版也會實作了, 但你不
會想走回頭路...
--
▂▅▂ ▁ ● ◣ 朴 ☆ 素 ★ 妍 ◢
◢ ◣ ◢▂▂◣ ◢▂※◣ ◢▄▂◣ T.T.L Listen 2
★ ★ ★ ★ ▉ ★ ★▏▉ ★ ★◣ http://ppt.cc/jIUk
◥ˇ◢ ▃◥ˇ◤▃ ◥ˇ◤ ◥ˇ◤◢ 說什麼結束
▃▃▇▃▃ ◢▇◣ ▋
▎ ▋¥▎ ◢ http://ppt.cc/zQtB
▼ ▼ ▼ ▼ ψ髮箍 ◤ ◣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
推 xatier:推l大精彩解說! 04/15 07:41
推 shec1213:好文 不M嗎XD 04/15 15:31
m自己文會怪怪的, 也沒啥好m啦! ~ " ~
※ 編輯: loveme00835 來自: 140.121.197.115 (04/15 16:22)
推 Rpdk:感謝 love大... 我基礎很差 可能要多花一點時間消化這篇文 3Q 04/15 17:22