1. 程式人生 > >探討兩種快速排序寫法與堆溢位的關係

探討兩種快速排序寫法與堆溢位的關係

       最近在做星圖識別匹配,因為需要對星表進行星等排序,對星等比較小,比較亮的星星進行優先選擇匹配,考慮到速度問題採用快速排序對其進行排序。正常的快速排序應該像方法一寫的所示,但是考慮到程式碼量的精簡,所以改動了原來的演算法,使用演算法二對其進行排序,剛開始資料混亂無序時,演算法二的確沒有問題,所以相信這種改進是有效的且更精簡,但是有一天使用了一個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);

         }

}