ジェネリッククイックソート機能を使用しようとしていますが、正しく動作していないため、何が問題なのか理解できません。私はそれが一般的なようにしようのないオリジナルのクイックソート機能は、ですがジェネリッククイックソートが機能しない
typedef bool (*CmpFunction)(void*, void*);
void swap(void *c1, void *c2)
{
assert(c1 && c2);
int c = *(int*)c1;
*(int*)c1 = *(int*)c2;
*(int*)c2 = c;
}
void quick_sort(void* a, int n, CmpFunction swap)
{
int p, b = 1, t = n - 1;
if (n < 2)
return;
swap((char*)a, (char*)a+n/2);
p = *(int*)a;
while(b <= t) {
while(t >= b && (char*)a + t >= p)
t--;
while(b <= t && (char*)a + b < p)
b++;
if (b < t)
swap((char*)a+(b++), (char*)a+(t--));
}
swap((char*)a, (char*)a+t);
quick_sort(a, t, swap);
n=n-t-1;
quick_sort(a + t + 1, n, swap);
}
:
int main(){
char b[] = {'a','t','b','c','y','s'};
int c[] = {1,4,6,3,5,7};
quick_sort(c, 6, &swap);
for (int i=0;i<6;i++)
printf("%d | ", c[i]);
return 0;
}
:私はこのメイン()を使用してい
void quick_sort(int a[], int n)
{
int p, b = 1, t = n - 1;
if (n < 2)
return;
swap(&a[0], &a[n/2]);
p = a[0];
while(b <= t) {
while(t >= b && a[t] >= p)
t--;
while(b <= t && a[b] < p)
b++;
if (b < t)
swap(&a[b++], &a[t--]);
}
swap(&a[0], &a[t]);
quick_sort(a, t);
n=n-t-1;
quick_sort(a + t + 1, n);
}
void swap(int *c1, int *c2)
{
int c = *c1;
*c1 = *c2;
*c2 = c;
}
ここ は私のコードです
出力は次のとおりです:
1, 3, 4, 5, 6, 7
これは実際にはNOT generic関数を実行したときに得られるものです。
ジェネリック(上位)関数を実行すると、基本的にはゴミ箱になります。
あなたはすべて私が間違っているアイディアを持っていますか? :)
'(char *)a + n/2'。それはあなたが望むものをあなたに与えることはありません。 'char *'を使ってポインタ演算を行いますが、算術演算は 'int *'で動作する必要があります。 – kaylum
比較関数として '&swap'を渡しました。また、CmpFunctionの定義もできませんでした。コンパイラの警告があります。汎用関数は、ポインタの配列を処理する必要があるか、配列要素の型が何であるかを知る必要があります。 – Schwern
@kaylum私はすべての(int *)を(char *)にchaningしようとしました。まだ動作していません:( –