7 Kasım 2017 Salı

qsort metodu

Giriş
Şu satırı dahil ederiz. Bu bir C dili metodu
#include <stdlib.h>
Birinci parametre diziye pointer.
İkinci parametre dizinin uzunluğu
Üçüncü parametre dizideki elemanın byte cinsinden büyüklüğü
Dördüncü parametre karşılaştırma metodu

Örnek
Şöyle yaparız. comparator metodun "const void*" olması gerekir.
int cmp(const void *v1, const void *v2) 
{
    const double *d1 = v1, *d2 = v2;
    ⋮
}

qsort(p, n, sizeof(double), cmp);
Şu kullanım yanlış
int cmp(const double *d1, const double *d2) 
{
    ⋮
}

qsort(p, n, sizeof(double), (int (*)(const void *, const void *))cmp);
Örnek
Sayıları artan şekilde sıralamak için şöyle yaparız
int cmp(const void *v1, const void *v2) {
  const int *p1 = v1, *p2 = v2;
  return (*p1 > *p2) - (*p1 < *p2);
}
Eğer NaN değerler varsa  şöyle yaparız
// sort by increasing values, with NaN after numbers
int cmp(const void *v1, const void *v2) {
  const double *p1 = v1, *p2 = v2;
  if (isnan(*p1)) {
    return isnan(*p2) ? 0 : 1;
  } else if (isnan(*p2)) {
    return -1;
  } else {
    return (*p1 > *p2) - (*p1 < *p2);
  }
}
Örnek
Eğe elimizde mevcut bir comparator varsa, kullanmak için şöyle yaparız
static int double_cmp(const double *d1, const double *d2)
    { return (*d1 > *d2) - (*d2 > *d1); }

static int double_void_cmp(const void *v1, const void *v2)
    { return double_cmp(v1, v2); }


double p[] = { 2.18, 6.28, 3.14, 1.20, 2.72, 0.58, 4.67, 0.0, 1, 1.68 };
const size_t n = sizeof p / sizeof *p;
qsort(p, n, sizeof *p, &double_void_cmp);
Örnek
Elimizde şöyle bir struct dizisi olsun.
struct foo{
    int a;
    int b;
};

struct foo arr[10];
Sıralama için şöyle yaparız.
int comp(const void *a, const void *b){

  struct s2 *q1 = (struct s2 *)a;
  struct s2 *q2 = (struct s2 *)b;

  return(q1->a - q2->a); 
}
Çağırmak için şöyle yaparız.
qsort (arr, 10, sizeof(struct foo), comp);

Hiç yorum yok:

Yorum Gönder