您的位置:首页 > 编程语言

随手小代码——在归并排序中对小数组采用插入排序

2015-07-28 20:01 399 查看
=================================版权声明=================================

[b]版权声明:本文为博主原创文章 未经许可不得转载
[/b]

请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

未经作者授权勿用于学术性引用。

未经作者授权勿用于商业出版、商业印刷、商业引用以及其他商业用途。                

本文不定期修正完善,为保证内容正确,建议移步原文处阅读。 <--------总有一天我要自己做一个模板干掉这只土豆

本文链接:/article/5266591.html

耻辱墙:/article/5266550.html

=======================================================================

这个思考题好奇怪的样子,还是先写写代码吧。

#include <iostream>

using namespace std;

void InsertionSortByWLS(int nArray[],int nLen)
{
int nTemp=0;

for (int nIndex=1;nIndex<nLen;nIndex++)
{
nTemp=nArray[nIndex];

int nCmpIndex;
for (nCmpIndex=nIndex;nCmpIndex>0 && nArray[nCmpIndex-1]>nTemp;nCmpIndex--)
{
nArray[nCmpIndex]=nArray[nCmpIndex-1];
}

if (nCmpIndex<nIndex)
{
nArray[nCmpIndex]=nTemp;
}
}
}

void MergeTwoParts(int nArr[],int nPos1,int nPos2,int nPos3)
{
int nSize=nPos3-nPos1+1;
int* nTempArr=new int[nSize];
memset(nTempArr,0,sizeof(int)*nSize);

int nLeftIndex=nPos1;
int nRightIndex=nPos2;

int nTempIndex=0;

while(nLeftIndex<nPos2 && nRightIndex<=nPos3)
{
if (nArr[nLeftIndex]<=nArr[nRightIndex])
{
nTempArr[nTempIndex++]=nArr[nLeftIndex++];
}
else
{
nTempArr[nTempIndex++]=nArr[nRightIndex++];
}
}

while (nRightIndex<=nPos3)
{
nTempArr[nTempIndex++]=nArr[nRightIndex++];
}

while (nLeftIndex<nPos2)
{
nTempArr[nTempIndex++]=nArr[nLeftIndex++];
}

memcpy(nArr+nPos1,nTempArr,nSize*sizeof(int));

delete[] nTempArr;
}

void MergeSortViaInsertionSortByWLS(int nArr[],int nStartPos,int nEndPos,int nLenforIS)
{
//     if (nStartPos<nEndPos)
//     {
//         int nDivide=(nStartPos+nEndPos)/2;
//
//         MergeSortByWLS(nArr,nStartPos,nDivide);
//         MergeSortByWLS(nArr,nDivide+1,nEndPos);
//
//         MergeTwoParts(nArr,nStartPos,nDivide+1,nEndPos);
//     }

if (nStartPos<nEndPos)
{
int nDivide=(nStartPos+nEndPos)/2;

if (nDivide-nStartPos<nLenforIS  && nStartPos<nDivide)
{
InsertionSortByWLS(nArr+nStartPos,nDivide-nStartPos+1);
}
else
{
MergeSortViaInsertionSortByWLS(nArr,nStartPos,nDivide,nLenforIS);
}

if (nEndPos-nDivide+1<nLenforIS && nDivide<nEndPos )
{
InsertionSortByWLS(nArr+nDivide+1,nEndPos-nDivide);
}
else
{
MergeSortViaInsertionSortByWLS(nArr,nDivide+1,nEndPos,nLenforIS);
}

MergeTwoParts(nArr,nStartPos,nDivide+1,nEndPos);
}
}

int _tmain(int argc, _TCHAR* argv[])
{
int nTestArray2[13]={99,35,50,10,101,5,66,100,6,88,22,111,33};

MergeSortViaInsertionSortByWLS(nTestArray2,0,12,5);

for (int i=0;i<13;i++)
{
cout<<nTestArray2[i]<<" ";
}
cout<<endl;

return 0;
}


这样应该更好点

void MergeSortViaInsertionSortByWLS2(int nArr[],int nStartPos,int nEndPos,int nLenforIS)
{
if (nStartPos>=nEndPos)
{
return;
}

if (nEndPos-nStartPos<nLenforIS)
{
InsertionSortByWLS(nArr,nEndPos-nStartPos+1);
}
else
{
int nDivide=(nStartPos+nEndPos)/2;

MergeSortViaInsertionSortByWLS(nArr,nStartPos,nDivide,nLenforIS);
MergeSortViaInsertionSortByWLS(nArr,nDivide+1,nEndPos,nLenforIS);

MergeTwoParts(nArr,nStartPos,nDivide+1,nEndPos);
}
}


测试(添加windows.h)

int _tmain(int argc, _TCHAR* argv[])
{
int nTestArray2[27]={3,1,5,9,6,7,2,8,4,0,99,77,88,66,55,32,21,65,54,78,98,51,53,65,95,15,35};

LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;

QueryPerformanceCounter(&nBeginTime); // 开始计时

MergeSortViaInsertionSortByWLS(nTestArray2,0,26,9);

QueryPerformanceCounter(&nEndTime);// 结束计时
cout <<nEndTime.QuadPart-nBeginTime.QuadPart<< endl;

for (int i=0;i<27;i++)
{
cout<<nTestArray2[i]<<" ";
}
cout<<endl;

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