2013-09-27 79 views
3

我在排序二維動態結構數組時遇到問題。如何排序結構的二維動態數組

我有一個結構:

typedef struct abc 
{ 
    int total; 
} abc; 

和動態二維數組:

list = (abc**)malloc(listSize * sizeof(abc*)); 
    for (int i = 0; i < listSize; i++) 
    { 
     list[i] = (abc*)malloc(listSize2* sizeof(abc)); 
    } 

我想用一個排序算法:

qsort(list, listSize, sizeof list[0], cmp); 

,爲比較函數qsort:

int cmp(const void *l, const void *r) 
{ 
    const abc *a = *(const abc **)l; 
    const abc *b = *(const abc **)r; 

    return a[0].total > b[0].total; 

} 

但問題是,雖然我認爲它適用於一個小列表(如約5個整數),但如果列表有點大,它將無法正確排序。我應該怎麼做的cmp()函數,以便它正常工作?

順便說一句,我只需要排序list[x][0],因爲我將在稍後添加更多元素。

(I'm basing my sorting code from another Stackoverflow post)

+0

參見[SSCCE(http://SSCCE.org/) – wich

回答

5

變化比較功能,它的問題:

int cmp(const void *l, const void *r) 
{ 
    const abc *a = *(const abc **)l; 
    const abc *b = *(const abc **)r; 

    return a[0].total - b[0].total; 

} 

使用qsort預期比較函數將返回負,如果第一個值小於正面的,如果它是做大如果兩個值相等,則爲0。

編輯:感謝WhozCraig:如果你認爲你可以在撞擊或溢出你可以去一個更安全的版本:

int cmp(const void *l, const void *r) 
{ 
    const abc *a = *(const abc **)l; 
    const abc *b = *(const abc **)r; 

    if (a[0].total < b[0].total) { 
     return -1; 
    } else if (a[0].total > b[0].total) { 
     return 1; 
    } else { 
     return 0; 
    } 
} 
+1

唯一有問題的是如果'a [0] .total'已經是一個負數並且'b [0] .total是一個非常大的*正*數字。減法方法會發生下溢(或如果符號顛倒,則溢出)。 – WhozCraig

+0

@WhozCraig其實這是一個好點:) –

+1

是的,這樣做。你也可以用'return(a WhozCraig

2

具有以下結構:

typedef struct abc { 
    int total; 
} ABC; 

比較功能可以是簡單的如:

int cmp(const void *l, const void *r) 
{ 
    const ABC *a = (const ABC *) l; 
    const ABC *b = (const ABC *) r; 
    if (a->total == b->total) return 0; 
    return (a->total < b->total) ? -1 : 1; 
} 

用於例如像:

ABC list[][4] = {{{5},{2},{0},{4}}, 
        {{7},{3},{9},{1}}, 
        {{8},{6},{5},{7}}, 
        {{2},{7},{9},{5}}}; 

qsort(list, 4 * 4, sizeof(ABC), cmp); 

for (int i = 0; i < 4; ++i) 
    for (int j = 0; j < 4; ++j) 
     printf("%d ",list[i][j].total); 

輸出:0 1 2 2 3 4 5 5 5 6 7 7 7 8 9 9

而如果你想它的行內唯一的排序,你可以這樣做:

for (int i = 0; i < 4; ++i)     
    qsort(list[i], 4, sizeof(ABC), cmp); 

這將使你:0 2 4 5 1 3 7 9 5 6 7 8 2 5 7 9。在這種情況下(在行內進行排序),整個list是否存儲在單個存儲塊中並不重要。無論它是否已被動態分配或不:)

+0

在C'S qsort比較函數不是布爾值,它返回一個負值,正值或0. –

+0

@IvayloStrandjev:是的。謝謝,我解決了。儘管之前的版本也以某種方式工作。 – LihO

+0

@LihO在Ivaylo Strandjev的評論和代碼確實試圖對其進行排序之後,我在編輯之前看到了您的代碼,但列表仍然很混亂。由於某種原因,編輯後的代碼似乎不起作用。給我一個分段錯誤。 – StarShire