• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            在OpenCASCADE使用包SortTools中的排序功能

            Posted on 2012-06-30 20:20 eryar 閱讀(2140) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            Use the Sort Function in the Package SortTools of the Toolkit TKernel

            eryar@163.com China

            OpenCASCADEToolkit TKernel中有個排序包(Package SortTools),可以對整數和實數進行排序。排序方法有四種:堆排序、快速排序、希爾排序、直接插入排序。這幾種排序方法都是靜態方法,因此,可以用對象名調用,這時,將靜態方法看作是某個名空間的一個函數。排序包中對應幾種排序方法的幾個類如下:

            • SortTools_HeapSortOfInteger ——》 整數的堆排序;
            • SortTools_HeapSortOfReal ——》實數的堆排序;
            • SortTools_QuickSortOfInteger ——》整數的快速排序;
            • SortTools_QuickSortOfReal ——》實數的快速排序;
            • SortTools_ShellSortOfInteger ——》整數的希爾排序;
            • SortTools_ShellSortOfReal ——》實數的希爾排序;
            • SortTools_StraightInsertionSortOfInteger ——》整數的直接插入排序;
            • SortTools_StraightInsertionSortOfReal ——》實數的直接插入排序;

            以整數的快速排序為例,講解排序工具包的用法。在SortTools_QuickSortOfInteger Class Reference中看到類SortTools_QuickSortOfInteger的排序函數為一個靜態函數Sort,其聲明為:

               1:  static void  Sort (TColStd_Array1OfInteger &TheArray, const TCollection_CompareOfInteger &Comp) 

            參數TheArray為等排序的數組;

            參數Comp為用來比較數據中元素的類;

            快速排序算法主要源代碼如下:(若需要對算法進行理解,請參考數據結構與算法的相關書籍。)

            inline void Exchange(Item& Left, Item& Right)
            {  
              Item Temp = Left;
              Left = Right;
              Right = Temp;
            }
             
            static void SortRecursive(Array& TheArray,
                          const Comparator& Comp,
                          const Standard_Integer Left, 
                          const Standard_Integer Right)
            {
              Item Pivot;
              Standard_Integer Front, Back, Middle;
              
              if(Left < Right) {
                Middle = (Left + Right) / 2;
                if(Comp.IsLower(TheArray(Middle), TheArray(Left))) {
                  Exchange(TheArray(Middle), TheArray(Left));
                }
                if(Comp.IsLower(TheArray(Right), TheArray(Left))) {
                  Exchange(TheArray(Right), TheArray(Left));
                }
                if(Comp.IsLower(TheArray(Right), TheArray(Middle))) {
                  Exchange(TheArray(Right), TheArray(Middle));
                }
                Pivot = TheArray(Middle);
                Exchange(TheArray(Middle), TheArray(Right - 1));
                Front = Left + 1;
                Back = Right - 1;
                if(Back != TheArray.Lower()) {
                  Back = Back - 1;
                }
                for(;;) {
                  while (Comp.IsLower(TheArray(Front), Pivot)) {
                Front = Front + 1;
                  }
                  while (Comp.IsLower(Pivot, TheArray(Back))) {
                Back = Back - 1;
                  }
                  if(Front <= Back) {
                if(Front == TheArray.Upper()) return;
                if(Back == TheArray.Lower()) return;  
                Exchange(TheArray(Front), TheArray(Back));
                Front = Front + 1;
                Back = Back - 1;
                  }
                  if(Front > Back) break;
                }
                SortRecursive(TheArray, Comp, Left, Back);
                SortRecursive(TheArray, Comp, Front, Right);
              }
            }
             
            void SortTools_QuickSort::Sort(Array& TheArray, 
                          const Comparator& Comp)
            {
              SortRecursive(TheArray, Comp, TheArray.Lower(), TheArray.Upper()); 
            }

            使用快速排序方法的簡單代碼示例如下:

            //------------------------------------------------------------------------------
            //    Copyright (c) 2012 eryar All Rights Reserved.
            //
            //        File    : Main.cpp
            //        Author  : eryar@163.com
            //        Date    : 2012-6-23 8:32
            //        Version : 1.0v
            //
            //    Description : Test SortTools Package in the OpenCASCADE.
            //
            //==============================================================================
             
            #include <TColStd_Array1OfInteger.hxx>
            #include <TCollection_CompareOfInteger.hxx>
            #include <SortTools_QuickSortOfInteger.hxx>
             
            void    DumpArray(const TColStd_Array1OfInteger& a);
             
            int main(int argc, char* argv[])
            {
                TColStd_Array1OfInteger quickSortArray(1, 6);
                TCollection_CompareOfInteger    aComp;
             
                // Use zero to initialize the array.
                quickSortArray.Init(0);
             
                // Set value of the array.
                quickSortArray.SetValue(1, 2);
                quickSortArray.SetValue(2, 50);
                quickSortArray.SetValue(3, 3);
                quickSortArray.SetValue(4, 60);
                quickSortArray.SetValue(5, 100);
                quickSortArray.SetValue(6, 70);
             
                // Before sort, dump the array.
                DumpArray(quickSortArray);
             
                // Sort the array.
                // Because the Sort method is static, so can call it directly.
                SortTools_QuickSortOfInteger::Sort(quickSortArray, aComp);
             
                // Dump information.
                DumpArray(quickSortArray);    
             
                return 0;
            }
             
            void DumpArray( const TColStd_Array1OfInteger& a )
            {
                // Dump information.
                cout<<"Array items start:"<<endl;
                for (Standard_Integer i = a.Lower(); i <= a.Upper(); i++)
                {
                    cout<<a.Value(i)<<endl;
                }
                cout<<"Array items end..."<<endl;
            }

            輸出結果如下:

               1:  Array items start:
               2:  2
               3:  50
               4:  3
               5:  60
               6:  100
               7:  70
               8:  Array items end...
               9:  Array items start:
              10:  2
              11:  3
              12:  50
              13:  60
              14:  70
              15:  100
              16:  Array items end...
              17:  Press any key to continue . . .

            若使用C++的模板功能,就不會分成整數和實數兩個類來區別對待啦。:-)

            觸類旁通,其它排序方法的使用都是類似的。可以結合數據結構與算法書中的排序內容來對排序算法進行深入理解。

            伊人久久大香线蕉av不卡| 9191精品国产免费久久| 国产99久久久国产精免费| 亚洲精品无码专区久久久| 色婷婷综合久久久久中文字幕| 久久久九九有精品国产| 精品久久久久久亚洲| 久久精品国产精品青草app| 国产精品久久久久aaaa| 久久久久四虎国产精品| 青青草原综合久久| 狠狠色丁香久久婷婷综| 日本精品久久久久中文字幕| 国产精品久久久久影院色| 国产成人精品久久一区二区三区| 欧美va久久久噜噜噜久久| 久久亚洲欧美国产精品 | 18禁黄久久久AAA片| 久久婷婷五月综合国产尤物app| 精品国产日韩久久亚洲| 久久亚洲美女精品国产精品| 国产精品一久久香蕉国产线看| 久久久久综合网久久| 亚州日韩精品专区久久久| 无码国内精品久久综合88| .精品久久久麻豆国产精品| 26uuu久久五月天| 久久久久亚洲精品日久生情| 国产精品久久毛片完整版| 无码任你躁久久久久久老妇| 久久夜色精品国产网站| 久久久久国产精品麻豆AR影院| 久久久久久免费视频| 99久久久精品| 性做久久久久久久久浪潮| 久久久女人与动物群交毛片| 久久精品成人免费观看97| 久久精品人人做人人爽97| 热综合一本伊人久久精品| 免费精品99久久国产综合精品| 国产精品久久久香蕉|