• <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>
            CodeBeauty
            春暖花開
            posts - 6,comments - 3,trackbacks - 0
            經(jīng)典排序算法-歸并排序MergeSort
            歸并排序(Merge sort,即合并排序)
            是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。其時(shí)間復(fù)雜度為O(n)O(最優(yōu))、(nlog n)(最差)。

            算法描述

            歸并排序具體工作原理如下(假設(shè)序列共有n個(gè)元素):

            1. 將序列每相鄰兩個(gè)數(shù)字進(jìn)行歸并操作,形成floor(n/2)個(gè)序列,排序后每個(gè)序列包含兩個(gè)元素
            2. 將上述序列再次歸并,形成floor(n/4)個(gè)序列,每個(gè)序列包含四個(gè)元素
            3. 重復(fù)步驟2,直到所有元素排序完畢
             

            其中一次歸并操作的過程如下:

            1. 申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來存放合并后的序列
            2. 設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置
            3. 比較兩個(gè)指針?biāo)赶虻脑兀x擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置
            4. 重復(fù)步驟3直到某一指針達(dá)到序列尾
            5. 將另一序列剩下的所有元素直接復(fù)制到合并序列尾
              #include <iostream>
              using namespace std;

               
              //合并排序的合并程序他合并數(shù)組nData中位置為[nP,nM) 和[nM,nR).這個(gè)是更接近標(biāo)準(zhǔn)的思路
               bool MergeStandard(int nData[], int nP, int nM, int nR)
               
              {
                   
              int n1 = nM - nP;        //第一個(gè)合并數(shù)據(jù)的長(zhǎng)度
                   int n2 = nR - nM;        //第二個(gè)合并數(shù)據(jù)的長(zhǎng)度
               
                   
              int *pnD1 = new int[n1 + 1];        //申請(qǐng)一個(gè)保存第一個(gè)合并數(shù)據(jù)的空間
                   int *pnD2 = new int[n2 + 1];        //申請(qǐng)一個(gè)保存第二個(gè)合并數(shù)據(jù)的空間
               
                   
              for (int i = 0; i < n1; ++i)        //復(fù)制第一個(gè)數(shù)據(jù)到臨時(shí)空間里面
                   {
                       pnD1[i] 
              = nData[nP + i];
                   }

                   pnD1[n1] 
              = INT_MAX;                    //將最后一個(gè)數(shù)據(jù)設(shè)置為最大值(哨兵)
               
                   
              for (i = 0; i < n2; ++i)        //復(fù)制第二個(gè)數(shù)據(jù)到臨時(shí)空間里面
                   {
                       pnD2[i] 
              = nData[nM + i];
                   }

                   pnD2[n2] 
              = INT_MAX;                    //將最后一個(gè)數(shù)據(jù)設(shè)置為最大值(哨兵)
                   
                   n1 
              =  n2 = 0;
               
                   
              while(nP < nR)
                   
              {
                       nData[nP
              ++= pnD1[n1] <  pnD2[n2] ? pnD1[n1++] : pnD2[n2++];        //取出當(dāng)前最小值到指定位置
                   }

               
                   delete []pnD1;
                   delete []pnD2;
                   
              return true;
               }


               
              //合并的遞歸調(diào)用,排序[nBegin, nEnd)區(qū)間的內(nèi)容
               bool MergeRecursion(int nData[], int nBegin, int nEnd)
               
              {
                   
              if (nBegin >= nEnd - 1)        //已經(jīng)到最小顆粒了,直接返回
                   {
                       
              return false;
                   }

               
                   
              int nMid = (nBegin + nEnd) / 2;            //計(jì)算出他們的中間位置,便于分治
                   MergeRecursion(nData, nBegin, nMid);    //遞歸調(diào)用,先合并排序好左邊一半
                   
                   MergeRecursion(nData, nMid, nEnd);        
              //遞歸調(diào)用,后合并排序好右邊一半
                  
              // Merge(nData, nBegin, nMid, nEnd);        //將已經(jīng)合并排序好的左右數(shù)據(jù)合并,時(shí)整個(gè)數(shù)據(jù)排序完成
                   MergeStandard(nData, nBegin, nMid, nEnd);//(用更接近標(biāo)準(zhǔn)的方法合并)
                   
              //Output(nData,nEnd);
                   return true;
               }

               
               
              //合并排序
               bool MergeSort(int nData[], int nNum)
               
              {
                  
              return MergeRecursion(nData, 0, nNum);        //調(diào)用遞歸,完成合并排序
              }


               
              //////////排序后輸出函數(shù)
               int Output(int b[],int length)
               
              {
                   
              for (int i=0;i<length;i++)
                   
              {
                       cout
              <<b[i]<<"  ";
                   }

                   cout
              <<endl;
                   
              return 1;
              }

               
              int main()
               
              {
                   
              //int nData[10] = {4,10,3,8,5,0,7,4,0,2};    //創(chuàng)建10個(gè)數(shù)據(jù),測(cè)試
                   int size_nData;
                   cout
              <<"Enter the numble of nData: size_nData=";
                   cin
              >>size_nData;
                   cout
              <<endl<<"Enter nData(size_a values):";
                   
              int* nData=new int[size_nData];
                   
              for (int i=0;i<size_nData;i++)
                   
              {
                       cin
              >>nData[i];
                   }


                   MergeSort(nData, size_nData);
                   Output(nData, size_nData);
               
                   delete []nData;
                   
              return 0;
               }

             

             

             

            日韩中文久久| 国内精品久久久久久不卡影院| 久久综合亚洲色HEZYO社区| 久久久久亚洲精品日久生情 | 欧美一区二区三区久久综合| 色综合久久无码中文字幕| 日本精品久久久久中文字幕8| 久久久久黑人强伦姧人妻| 久久久亚洲欧洲日产国码是AV| 91精品国产综合久久久久久| 国产精品亚洲综合专区片高清久久久| 亚洲乱码日产精品a级毛片久久| 色欲综合久久中文字幕网| 国产99久久久国产精免费| 亚洲va久久久噜噜噜久久| 精品乱码久久久久久夜夜嗨| 亚洲国产另类久久久精品黑人| 国产精品无码久久四虎| 国产精品美女久久久久久2018| 香蕉久久夜色精品国产2020| 久久精品国产精品亚洲精品| 久久亚洲熟女cc98cm| 久久久久久一区国产精品| 久久青草国产精品一区| 日韩久久久久久中文人妻| 中文字幕无码久久久| 精品无码久久久久久国产| 久久精品成人免费网站| 久久久久人妻一区精品色| 99蜜桃臀久久久欧美精品网站 | 久久亚洲国产成人影院网站| 9久久9久久精品| 久久精品中文騷妇女内射| 精品熟女少妇AV免费久久| 亚洲v国产v天堂a无码久久| 国内精品伊人久久久久网站| 精品久久久久久亚洲精品| 亚洲国产精品成人久久| 久久天天躁狠狠躁夜夜不卡| 亚洲精品高清一二区久久| 久久久精品久久久久久 |