Re: [問題] qsort能用在二維array嘛?
看板C_and_CPP作者softwind (software everywhere)時間14年前 (2010/07/10 00:01)推噓0(0推 0噓 0→)留言0則, 0人參與討論串2/2 (看更多)
※ 引述《lazybones (懶)》之銘言:
: 我現在有一個二維array A[10][10]
: 我想把A[0], A[1], A[2].... A[9]利用qsort去做排序
: qsort( A, 10, sizeof(*A), compare );
: 請問這樣寫的問題在哪邊...?
事實上 他是 100個element
A[0][0] ... A[0][9] // A[0] 等效 &A[0][0]
A[1][0] ... A[1][9] // A[1] 等效 &A[1][0]
.
.
.
A[9][0] ... A[9][9] // A[9] 等效 &A[9][0]
A 是 [10][10] so *一次 降一階 看到 [10]
所以sizeof(A) 看到全部大小, 100個element size
sizeof(*A) == sizeof(A[0]) 看到 10個element
我個人覺得 除了浪費空間外 倒是沒有太大問題
不過優點是 避免多次 alloc mem來放 那 [10] element
比較快 也不容易讓記憶體破碎
使用的sample
char str_buf[10][10] = {
"Alpha", //事實上是 "Alpha\0\0\0\0\0"
"Delta", // "Delta\0\0\0\0\0"
"Bravo",
"Charlie",
//...
};
compare function:
int comparator ( const void * p1, const void * p2 )
{
return strcmp( (char*)p1, (char*)p2)
}
然後 main裡面這樣用
qsort( str_buf,
sizeof(str_buf)/sizeof(str_buf[0]), // Number of elements
sizeof(*str_buf), //Size in bytes of each element
comparator);
qsort之前
+ [0] 0x00417000 "Alpha" char [10]
+ [1] 0x0041700a "Delta" char [10]
+ [2] 0x00417014 "Bravo" char [10]
+ [3] 0x0041701e "Charlie" char [10]
+ [4] 0x00417028 "" char [10]
+ [5] 0x00417032 "" char [10]
+ [6] 0x0041703c "" char [10]
+ [7] 0x00417046 "" char [10]
+ [8] 0x00417050 "" char [10]
+ [9] 0x0041705a "" char [10]
qsort 之後
+ [0] 0x00417000 "" char [10]
+ [1] 0x0041700a "" char [10]
+ [2] 0x00417014 "" char [10]
+ [3] 0x0041701e "" char [10]
+ [4] 0x00417028 "" char [10]
+ [5] 0x00417032 "" char [10]
+ [6] 0x0041703c "Alpha" char [10]
+ [7] 0x00417046 "Bravo" char [10]
+ [8] 0x00417050 "Charlie" char [10]
+ [9] 0x0041705a "Delta" char [10]
--
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.26.176.114
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):