#include <stdlib.h>
static void quicksort_(void *base,const size_t num,const size_t size
,void *temp,int (*compare)(const void *,const void *))
{
size_t pivot = 0,first2last = 0,last2first = num-1;
while(pivot+1 != num && !compare(base+size*pivot,base+size*(pivot+1))){
pivot++;
}
if(pivot+1 == num){
return;
}
if(0 > compare(base+size*pivot,base+size*(pivot+1))){
pivot++;
}
while(first2last < last2first){
while(0 < compare(base+size*pivot,base+size*first2last)
&& first2last != num-1){
first2last++;
}
while(0 >= compare(base+size*pivot,base+size*last2first)
&& last2first){
last2first--;
}
if(first2last < last2first){
if(pivot == first2last || pivot == last2first){
pivot = pivot^last2first^first2last;
}
memcpy(temp,base+size*first2last,size);
memcpy(base+size*first2last,base+size*last2first,size);
memcpy(base+size*last2first,temp,size);
}
}
quicksort_(base,first2last,size,temp,compare);
quicksort_(base+size*first2last,num-first2last,size,temp,compare);
}
int quicksort(void *base,const size_t num,const size_t size
,int (*compare)(const void *,const void *))
{
void *temp = malloc(size);
if(!temp){
return -1;
}
quicksort_(base,num,size,temp,compare);
free(temp);
return 0;
}
なんか物凄い金額を使ってしまった気がするのですが、恐らく気のせいでしょう。来年になったら少しずつ消化します。
非常に遅くなってしまいましたが、C75の新作告知です。反省はしていない。
\500で「モビルフォース ガンガルVSガンガル」を頒布します。頒布場所は2日目西お-09a「Fake Far」と2日目西よ-46b「がんばレ屋」です。
とりあえず、ハッカーと画家 コンピュータ時代の創造者たちだけ読了。プログラミング言語について考え直すのに良い切欠になる。
しかし、速度面の問題で Lisp は使える場面が限られてしまうと思う。考える為の道具としては良く出来ているのだけど。(だから使うべきかどうかは別として、Lisp を学ぶべきなのだろう。)
妥協案としては、C のような構文を持ちながらも、ソースコード全体はコンパイラへの指示のリストとなっており、それによって柔軟なマクロを実現出来るような言語が考えられる。
このような新しいアイディアを得られる本はそう滅多に無い、技術系の話だけではなくハッカー自体に関しても色々書かれており、一般人が読んでも面白い本だと思う。