C汎用プログラミングによる高速レイアウト
1970 ワード
# include <stdio.h>
# include <stdlib.h>
# include <string>
# define X[i] (char *)X+size*(i)
int size;
void swap (void *a, void *b) {
char t[size];
memcpy (t, a, size);
memcpy (a, b, size);
memcpy (b, t, size);
return;
}
typedef struct pair {
int left;
int right;
};
int cpr(void *a, void *b) {
pair *A = (pair*)a;
pair *B = (pair*)b;
return A->right - B->right;
}
typedef int (*compare)(void *a, void *b);
int partition (void *A, int p, int r, compare c) {
int q = p;
for (int i = p + 1; i <= r; ++ i) {
void *x = (char *)A + size * i;
//void *x = (char *)A[i];
void *y = (char *)A + size * p;
if (c(x, y) < 0){
++ q;
void *z = (char *)A + size * q;
swap (x,z);
}
}
void *z = (char *)A + size * q;
void *x = (char *)A + size * p;
swap(z, x);
return q;
}
void qsort(void *A, int p, int r, compare c) {
while (p < r) {
int q = partition(A, p, r,c);
qsort (A, p, q - 1, c);
p = q + 1;
}
}
int main () {
size = sizeof(pair);
pair A[10];
srand (time(NULL));
for (int i = 0; i < 10; ++ i) {
A[i].left = rand() % 90 + 10;
A[i].right = rand() % 90 + 10;
}
A[0].left = 5;
A[0].right = 5;
qsort (A, 0, 9, cpr);
for (int i = 0; i < 10; ++ i) {
printf ("%d ", A[i].left);
}
printf ("
");
for (int i = 0; i < 10; ++ i) {
printf ("%d ", A[i].right);
}
printf ("
");
system("pause");
return 0;
}