探讨两种快速排序写法与堆溢出的关系

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

         }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值