=================================版权声明=================================

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

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

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

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

 

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

本文链接: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;

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

 纸上得来终觉浅,绝知此事要躬行。

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