Bir dizi sıralama algoritmasını karşılaştırmak için ev ödevimi yapıyorum ve garip bir fenomene rastladım. Şeyler beklendiği gibi oldu: insertionsort 20 inçlik tablo gibi bir şey için kazanma, aksi halde çabukluğu, heapsort ve mergesort üstün performans. 500.000 inçlik bir tabloya kadar (bellekte saklanır). 5.000.000 inç (hala hafızada saklanır) için, hızlı bağlantı, aniden daha kötü hale gelir, ardından heapsort ve mergesort. Sayılar her zaman eşit olarak dağıtılır, rasgele pencereler sanal bellek kapalıdır. Bunun sebebi ne olabilir?büyük tablolar için garip yavaş quicksort
void quicksortit(T *tab,int s) {
if (s==0 || s==1) return;
T tmp;
if (s==2) {
if (tab[0]>tab[1]) {
tmp=tab[0];
tab[0]=tab[1];
tab[1]=tmp;
}
return;
}
T pivot=tab[s-1];
T *f1,*f2;
f1=f2=tab;
for(int i=0;i<s;i++)
if (*f2>pivot)
f2++;
else {
tmp=*f1;
*f1=*f2;
*f2=tmp;
f1++; f2++;
}
quicksortit(tab,(f1-1)-tab);
quicksortit(f1,f2-f1);
};
ama benim ilk tahminim işlemci cache fazla sayıda yaşıyoruz olduğu Örneğin
Daha büyük veri kümeleri nedeniyle. –
Büyük dizilerle, algoritmayı çalıştırmaktansa iyi bir pivot değeri seçmek daha önemlidir. 'P pivot = tab [s/2]' yi deneyin ve bunun nasıl yardımcı olduğunu görün – smac89
Kodunuzun her bir çalışması için tohum değerinizi değiştiriyor musunuz, yoksa her zaman aynı 5 milyonluk boyut dizisini kullanıyor musunuz? – jxh