最近在做星图识别匹配,因为需要对星表进行星等排序,对星等比较小,比较亮的星星进行优先选择匹配,考虑到速度问题采用快速排序对其进行排序。正常的快速排序应该像方法一写的所示,但是考虑到代码量的精简,所以改动了原来的算法,使用算法二对其进行排序,刚开始数据混乱无序时,算法二的确没有问题,所以相信这种改进是有效的且更精简,但是有一天使用了一个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);
}
}