我一直在做我的作業,這是比較一堆排序算法,我遇到了一個奇怪的現象。事情一直如預期的那樣:insertionsort贏得了20個int表,否則quicksort勝過heapsort和mergesort。最多500,000英鎊(存儲在內存中)。對於5,000,000個整數(仍然保存在內存中),quicksort會突然變差,然後會出現heapsort和mergesort。數字總是隨機分佈的,窗口虛擬內存關閉。任何人都有一個想法可能是什麼原因呢?對於大型表格奇怪的慢速排列
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);
};
我不知道你是什麼系統,但我的第一個猜測是,你正在經歷處理器高速緩存未命中的數量更多由於數據集較大。 – 2014-11-03 21:04:29
對於大型數組,選擇比簡單運行算法更好的樞軸值變得更重要。試試'T pivot = tab [s/2];'看看有什麼幫助 – smac89 2014-11-03 21:05:22
你是否改變你的代碼的每次運行的種子值,還是總是使用相同的初始500萬大小的數組? – jxh 2014-11-03 21:09:11