Qsortで2 D配列をソートする
4311 ワード
malloc動的購買依頼の多次元配列(ポインタ配列)
1つの例で解析します:要求--1つの配列を操作するつもりで、配列の各要素は1つのポインタで、2つの要素の配列を指します.要素のサイズ関係は、最初の要素を比較し、最初の要素は同じように2番目の要素を比較します.
まず、mallocによってポインタ配列を割り当てます.まず、要素をintとする1次元配列を割り当てるので、配列タイプはint*です.次に,各配列内のint*型ポインタに対して1次元配列を割り当て,配列タイプはintとする.
このように申請された配列は、解放方式は
直接free(a)ではなく、mallocとfreeは一つ一つ対応するので、1つ目は正しいです.
qsortのcmpの書き方:入参は実際に配列要素のポインタであり、ここで要素はint*であるため、入参はint**であるべきで、比較する配列はこのポインタが指す内容である.
void*aを強制的に本来の姿int**に変換し、apポインタはaの最初の要素を指す(この要素もポインタであり、int型の1次元配列を指す).
非malloc申請の多次元配列について
例えば、2次元配列int a[5][2];要件:2 D配列の各次元の最初の要素に従ってパラメータ関数を比較します.
構造体のソートは比較的簡単です.構造体の構造:
アルゴリズムcmpを比較すると、強制転換は->優先度より高いことを覚えておいてください.
並べ替え:
http://blog.csdn.net/puppylpg/article/details/48877353
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