【Data_Structure笔记6】排序算法之【二路归并排序】

来源:互联网 发布:虚与委蛇 知乎 编辑:程序博客网 时间:2024/05/21 14:02
/************************************************************************************************************************文件说明:        二路归并排序*************************************************************************************************************************/#include<iostream>#include<string>#include<string.h>using namespace std;/************************************************************************************************************************函数说明:        【1】Merge()函数的功能是将前后相邻的【两个有序表】归并为一个有序表的算法。【2】该两段有序表A[Low....Mid]、A[Mid+1......High]存放在同一顺序表中相邻的位置上,先将它们复制到【辅助数组B中】。     每次从B中的两个段取出一个记录进行关键字的比较,将较小的关键字放入A中。【3】当数组B中有一段超过其表长时,将另一段中的剩余部分直接复制到A中。*************************************************************************************************************************/template<typename ElemType>void MergeArray(ElemType arrayT[], int iLow, int iMid, int iHigh, ElemType pTempArray[]){                                               //【1】序列表的前后两端各自有序,将它们合并成一个有序的列表int i = iLow;int j = iMid + 1;int k = 0;while (i<=iMid&&j<=iHigh)     {if (arrayT[i]<= arrayT[j])            //【2】比较序列表前后两端中的元素{pTempArray[k++] = arrayT[i++];    //【3】将较小的值复制到辅助数组pTempArray}else{pTempArray[k++] = arrayT[j++];}}//whilewhile(i<=iMid)                           //【4】若第一个表未检测完,复制{pTempArray[k++] = arrayT[i++];}while(j<=iHigh)                          //【5】若第二个表未检测完,复制{pTempArray[k++] = arrayT[j++];}for (i=0;i<k;i++)                        //【6】将排好序的序列复制到原始序列中,则原始序列为本次排序之后的结果{arrayT[iLow + i] = pTempArray[i];}}template<typename ElemType>void MergeSort(ElemType arrayT[], int iLow, int iHigh, ElemType pTempArray[]){if (iLow<iHigh){int iMid = (iLow + iHigh) / 2;                          //【1】从中间划分为两个子序列MergeSort<int>(arrayT, iLow, iMid, pTempArray);         //【2】对左侧的子序列进行递归排序MergeSort<int>(arrayT, iMid + 1, iHigh, pTempArray);    //【3】对右侧的子序列进行递归排序MergeArray<int>(arrayT, iLow, iMid, iHigh, pTempArray); //【4】最终,将两个有序序列合并起来}}/************************************************************************************************************************模块说明:        控制台应用程序的入口点*************************************************************************************************************************/int main(int argc,char* argv[]){int        arrayT[15] = {22,32,44,34,56,21,24,345,213,234,245,127,113,119,933};int*       pTempArray = (int*)std::malloc(15*sizeof(int));  //【1】定义一个辅助数组Bmemset(pTempArray,0,(15*sizeof(int)));MergeSort<int>(arrayT,0,14,pTempArray);std::cout<<"===================================================="<<std::endl;for(int i=0;i<15;i++){std::cout<<pTempArray[i]<<std::endl;}std::system("pause");return 0;}