您的位置:首页 > 其它

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

2017-08-26 20:58 519 查看
/************************************************************************************************************************
文件说明:
二路归并排序
*************************************************************************************************************************/
#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++];
}
}//while

while(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】定义一个辅助数组B

memset(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐