Qsortで2 D配列をソートする

4311 ワード

malloc動的購買依頼の多次元配列(ポインタ配列)
1つの例で解析します:要求--1つの配列を操作するつもりで、配列の各要素は1つのポインタで、2つの要素の配列を指します.要素のサイズ関係は、最初の要素を比較し、最初の要素は同じように2番目の要素を比較します.
まず、mallocによってポインタ配列を割り当てます.まず、要素をintとする1次元配列を割り当てるので、配列タイプはint*です.次に,各配列内のint*型ポインタに対して1次元配列を割り当て,配列タイプはintとする.
int *b,**a;
    a = (int**)malloc(500000*sizeof(int*)); //    int*   。
    for(i=0;i<500000;i++)
    {
        b = malloc(2*sizeof(int));
        a[i] = b;
    }

このように申請された配列は、解放方式は
for(i=0;ii++) 
{ 
      free(a[i]);
}
free(a); 

直接free(a)ではなく、mallocとfreeは一つ一つ対応するので、1つ目は正しいです.
qsortのcmpの書き方:入参は実際に配列要素のポインタであり、ここで要素はint*であるため、入参はint**であるべきで、比較する配列はこのポインタが指す内容である.
void*aを強制的に本来の姿int**に変換し、apポインタはaの最初の要素を指す(この要素もポインタであり、int型の1次元配列を指す).
int cmp(const void *a,const void *b)
{
    int *ap = *(int **)a;       
    int *bp = *(int **)b;

    if(ap[0] == bp[0])
        return ap[1] - bp[1];
    else
        return ap[0] - bp[0];
} 

非malloc申請の多次元配列について
例えば、2次元配列int a[5][2];要件:2 D配列の各次元の最初の要素に従ってパラメータ関数を比較します.
int cmp(const void *a, const void *b)
{
    return ((int *)a)[0] - ((int *)b)[0];
}

構造体のソートは比較的簡単です.構造体の構造:
typedef struct node{
    int x;              
    int y;              
    int z;              
}Node;

アルゴリズムcmpを比較すると、強制転換は->優先度より高いことを覚えておいてください.
int cmp(const void *a, const void *b)
{
//    return (Node *)a->x - (Node *)b->x;   ////    return ((Node *)a)->x - ((Node *)b)->x;   //    1
    return (*(Node *)a).x - (*(Node *)b).x;     //    2
}

並べ替え:
qsort(a, n, sizeof(a[0]), cmp);

http://blog.csdn.net/puppylpg/article/details/48877353