探討兩種快速排序寫法與堆溢位的關係
最近在做星圖識別匹配,因為需要對星表進行星等排序,對星等比較小,比較亮的星星進行優先選擇匹配,考慮到速度問題採用快速排序對其進行排序。正常的快速排序應該像方法一寫的所示,但是考慮到程式碼量的精簡,所以改動了原來的演算法,使用演算法二對其進行排序,剛開始資料混亂無序時,演算法二的確沒有問題,所以相信這種改進是有效的且更精簡,但是有一天使用了一個1度視場的星表(有序),星的數目大於10000時,發現演算法提示堆疊溢位的問題,所以開始懷疑快速演算法本身,但是當我把演算法改為演算法一時發現不會出現這個問題。
所以演算法一與演算法二的區別在於演算法二在有序的初始資料的情況下,它的堆疊是呈直線型增長的,資料量有多大,所需堆疊就需要多大,而演算法一的堆疊不是成線性增長的,與完全樹形的高度相當,大大減小了在有序情況下時候堆疊的大小
方法一:
void QuickRankCatalog(int left,int right){
if(left
int pivotloc = partition(left, right);
QuickRankCatalog(left, pivotloc-1);
QuickRankCatalog(pivotloc+1, right);
}
}
int partition(int left,int right){
int l=left, r=right;
StarInfo tempStar = cataInfo.get(left);
//System.out.println(left +" "+right);
while(l < r){
while(l<= cataInfo.get(r).mag)
r--;
cataInfo.set(l, cataInfo.get(r));
while(l= cataInfo.get(l).mag)
l++;
cataInfo.set(r, cataInfo.get(l));
}
cataInfo.set(l, tempStar);
return l;
}
方法二:
void QuickRankCatalog(int left,int right){
if(left
int l=left, r=right;
StarInfo tempStar = cataInfo.get(left);
while(l < r){
while(l<= cataInfo.get(r).mag)
r--;
cataInfo.set(l, cataInfo.get(r));
while(l= cataInfo.get(l).mag)
l++;
cataInfo.set(r, cataInfo.get(l));
}
cataInfo.set(l, tempStar);
QuickRankCatalog(left, l-1);
QuickRankCatalog(l+1, right);
}
}