=================================版权声明=================================
版权声明:本文为博主原创文章 未经许可不得转载
请通过右侧公告中的“联系邮箱([email protected])”联系我
未经作者授权勿用于学术性引用。
未经作者授权勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善,为保证内容正确,建议移步原文处阅读。 <--------总有一天我要自己做一个模板干掉这只土豆
本文链接:http://www.cnblogs.com/wlsandwho/p/4677286.html
耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html
=======================================================================
1 #include "stdafx.h" 2 3 #include <iostream> 4 5 using namespace std; 6 7 void MergeTwoParts(int nArr[],int nPos1,int nPos2,int nPos3) 8 { 9 //by wls 2015/07/24 15:26:43 /// 10 11 int nSize=nPos3-nPos1+1; 12 int* nTempArr=new int[nSize]; 13 memset(nTempArr,0,sizeof(int)*nSize); 14 15 int nLeftIndex=nPos1; 16 int nRightIndex=nPos2; 17 18 int nTempIndex=0; 19 20 while(nLeftIndex<nPos2 && nRightIndex<=nPos3) 21 { 22 if (nArr[nLeftIndex]<=nArr[nRightIndex]) 23 { 24 nTempArr[nTempIndex++]=nArr[nLeftIndex++]; 25 } 26 else 27 { 28 nTempArr[nTempIndex++]=nArr[nRightIndex++]; 29 } 30 } 31 32 while (nRightIndex<=nPos3) 33 { 34 nTempArr[nTempIndex++]=nArr[nRightIndex++]; 35 } 36 37 while (nLeftIndex<nPos2) 38 { 39 nTempArr[nTempIndex++]=nArr[nLeftIndex++]; 40 } 41 42 memcpy(nArr+nPos1,nTempArr,nSize*sizeof(int)); 43 44 delete[] nTempArr; 45 } 46 47 void MergeSortByWLS(int nArr[],int nStartPos,int nEndPos) 48 { 49 if (nStartPos<nEndPos) 50 { 51 int nDivide=(nStartPos+nEndPos)/2; 52 53 MergeSortByWLS(nArr,nStartPos,nDivide); 54 MergeSortByWLS(nArr,nDivide+1,nEndPos); 55 56 MergeTwoParts(nArr,nStartPos,nDivide+1,nEndPos); 57 } 58 } 59 60 int _tmain(int argc, _TCHAR* argv[]) 61 { 62 // int nTestArray[13]={50,66,88,99,100,101,111,5,6,10,22,33,35}; 63 // MergeTwoParts(nTestArray,0,7,12); 64 // 65 // for (int i=0;i<13;i++) 66 // { 67 // cout<<nTestArray[i]<<" "; 68 // } 69 // cout<<endl; 70 71 int nTestArray2[13]={99,35,50,10,101,5,66,100,6,88,22,111,33}; 72 MergeSortByWLS(nTestArray2,0,12); 73 74 for (int i=0;i<13;i++) 75 { 76 cout<<nTestArray2[i]<<" "; 77 } 78 cout<<endl; 79 80 return 0; 81 }
=======================================================================
思路大家都知道,但是实现细节却也是很重要的。
一开始我的memcpy函数拷贝位置想当然的写了数组首地址,测试了很多数据才发现问题。
1 int nTestArray[13]={88,50,99,66,100,101,111,5,6,10,22,35,33}; 2 MergeTwoParts(nTestArray,3,7,11); 3 4 for (int i=0;i<13;i++) 5 { 6 cout<<nTestArray[i]<<" "; 7 } 8 cout<<endl;
=======================================================================
纸上得来终觉浅,绝知此事要躬行。
=======================================================================