您的位置:首页 > 其它

合并排序 算法实现

2010-06-13 13:52 218 查看
合并排序主要思想:把两个已经排序好的序列进行合并,成为一个排序好的序列。

复杂度:nlgn

稳定排序

实现

#include "stdafx.h"
#define INT_MAX 9999999
// 合并[pn, pm)[pm,pn)
// 其中[pn, pm)[pm,pn) 分别为已经排序的队列
void MergingSort(int nData[], int nP, int nM, int nR)
{
int nPrev = nM - nP;
int nLast = nR - nM;

int* pPrev = new int[nPrev+1];
int* pLast = new int[nLast+1];

for(int i=0; i<nPrev; i++)
{
pPrev[i] = nData[nP+i];
}
pPrev[nPrev] = INT_MAX;

for(int j=0; j<nLast; j++)
{
pLast[j] = nData[nM+j];
}
pLast[nLast] = INT_MAX;

nPrev = 0;
nLast = 0;

while(nP < nR)
{
nData[nP++] = pPrev[nPrev] < pLast[nLast] ? pPrev[nPrev++] : pLast[nLast++];
}

delete [] pPrev;
delete [] pLast;
}

bool Merge(int nData[], int nBegin, int nEnd)
{
if(nBegin >= nEnd-1)
{
return false;
}

int nMid = (nEnd + nBegin)/2;
Merge(nData, nBegin, nMid);
Merge(nData, nMid, nEnd);

MergingSort(nData, nBegin, nMid, nEnd);
return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
int nData[] = {1,3,5,7,9,2,4,6,8,0};
Merge(nData,0,10);

for(int i=0; i<10; i++)
{
printf("%d", nData[i]);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: