• <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++的模板功能,就不會分成整數和實數兩個類來區別對待啦。:-)

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

            国产午夜电影久久| 99久久精品免费国产大片| 精品久久亚洲中文无码| 中文字幕久久久久人妻| 国产Av激情久久无码天堂| 国产免费福利体检区久久| 久久久久精品国产亚洲AV无码| 精品国际久久久久999波多野 | 久久亚洲AV无码精品色午夜麻豆| 国内精品综合久久久40p| 伊人丁香狠狠色综合久久| 久久这里有精品| 久久久艹| 日韩欧美亚洲综合久久影院d3| 噜噜噜色噜噜噜久久| 精品人妻伦九区久久AAA片69| 欧美va久久久噜噜噜久久| 久久久久人妻一区精品 | 久久精品国产一区二区三区不卡| 久久精品aⅴ无码中文字字幕不卡| 久久美女网站免费| 99久久99久久精品国产片果冻 | 一本一本久久a久久综合精品蜜桃| 久久中文娱乐网| 粉嫩小泬无遮挡久久久久久| 久久久久久久精品成人热色戒 | 久久精品国产亚洲AV香蕉| 手机看片久久高清国产日韩| 亚洲嫩草影院久久精品| 久久精品国产99久久无毒不卡| 中文字幕久久久久人妻| 国产亚洲美女精品久久久2020| 久久久久综合中文字幕| 久久久精品人妻无码专区不卡| 精品水蜜桃久久久久久久| 久久国产精品久久| 91精品免费久久久久久久久| 亚洲一本综合久久| 色偷偷88欧美精品久久久| 亚洲国产精品嫩草影院久久| 亚洲国产精品无码久久青草 |