0

みなさん、こんにちは。Cで一般的な要素を並べ替えるプログラムを書いています。あらゆる種類のオブジェクト(int、float、複素数、オブジェクト)を並べ替えることができます。

私が考えたのは、voidポインタを使用することです。

void qsort(void *ptr,int sz,int i,int j,int (*fptr) (const void *,const void *) )
{

if(i<j)
{
    int p=(i+j)/2;
    p=partition(ptr,sz,i,j,p,fptr);
    qsort(ptr,size,i,p-1,fptr); 
    qsort(ptr,size,p+1,j,fptr); 
}
} 

比較のために

szの値によって、string、int、char、floatなどへのポインタであるかどうかがわかります。

int compare(const void* a,const void* b,int sz)
{
if(sz==0)             //means pointer to a string
return strcmp( (char*)a, (char*)b );
else if(sz==1)  //means int
return  *(int*)a -  *(int*)b;
else if(sz==2)  //means float
return *(float*)a-  *(float*)b;
else if(sz==3)
return *(char*)a-  *(char*)b;
}

2つの要素を交換するため

void swap(void *a,void *b,int sz)//for swapping
{
     if(sz==0)
     { 
      void *c;
      c=a;
      a=b;
      b=c;
      }
     else if(sz==1)
      {
      a=(int*)a;
      b=(int*)b;
      int c;
      c= *a;
      *a=*b;
      *b=c;
       }

     else if(sz==2)
     {
       a=(float*)a;
       b=(float*)b;
       float c;
       c= *a;
       *a=*b;
       *b=c;
     }

編集済み

qsort(arr、4,0,9、&compare);

完全なコードは作成中です。私のアプローチにいくつかの最適化があるかどうか、またはこの問題のいくつかのより良い代替案があるかどうか教えてください。本当に大きくなると思いますが

多くの人が事前に感謝します

4

3 に答える 3

2

スワップルーチンは関数によって使用される可能性が高いpartitionため、コードに渡す予定のオブジェクトだけでなく、任意のサイズのオブジェクトで機能する必要があります。

void swap (void *a, void *b, int sz) {
    char buf[512];
    void *p = buf;
    if (sz > sizeof(buf)) p = malloc(sz);
    memcpy(p, a, sz);
    memcpy(a, b, sz);
    memcpy(b, p, sz);
    if (p != buf) free(p);
}

比較ルーチンを作成した方法から、特定のタイプの配列のみを送信することを計画しているようです。ただし、sz通常は、配列内の個々の要素の大きさを示すために使用されます。使用しようとしているように見えるため、型識別子としては使用されません。

struct x { int key; /*...*/ };

int cmp_x (const void *a, const void *b) {
    const struct x *xa = a;
    const struct x *xb = b;
    return (xa->key > xb->key) - (xa->key < xb->key);
}

struct x array_x[100];
/* populate array */
qsort(array_x, sizeof(struct x), 0, 100, cmp_x);

qsortこれは私があなたが呼ばれるべきであると私が想像する方法です。(気の利いた比較の実装をしてくれたAmbroz Bizjakに感謝します。)

の配列の場合int

int cmp_int (const void *a, const void *b) {
    int ia = *(const int *)a;
    int ib = *(const int *)b;
    return (ia > ib) - (ia < ib);
}

int array_i[100];
/* populate array */
qsort(array_i, sizeof(int), 0, 100, cmp_int);
于 2012-07-07T05:11:23.443 に答える
1

あなたがすべきことは、関数ポインタとして比較を渡すことです。関数ポインタを渡していますが、値を比較するために関数ポインタを使用していないようです。使用する値のタイプに応じて、使用時に比較を定義できるため、すべての比較を事前に定義する必要はありません。

于 2012-07-07T05:05:27.060 に答える
1

問題は、これでは構造体などのカスタムタイプの並べ替えができないことです。通常のアプローチは、比較を行うために呼び出す関数ポインターを受け入れることです。

于 2012-07-07T04:57:08.533 に答える