=================================版权声明=================================
版权声明:本文为博主原创文章 未经许可不得转载
请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我
未经作者授权勿用于学术性引用。
未经作者授权勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善,为保证内容正确,建议移步原文处阅读。 <--------总有一天我要自己做一个模板干掉这只土豆
本文链接:http://www.cnblogs.com/wlsandwho/p/4684198.html
耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html
=======================================================================
这个思考题好奇怪的样子,还是先写写代码吧。
1 #include <iostream> 2 3 using namespace std; 4 5 void InsertionSortByWLS(int nArray[],int nLen) 6 { 7 int nTemp=0; 8 9 for (int nIndex=1;nIndex<nLen;nIndex++) 10 { 11 nTemp=nArray[nIndex]; 12 13 int nCmpIndex; 14 for (nCmpIndex=nIndex;nCmpIndex>0 && nArray[nCmpIndex-1]>nTemp;nCmpIndex--) 15 { 16 nArray[nCmpIndex]=nArray[nCmpIndex-1]; 17 } 18 19 if (nCmpIndex<nIndex) 20 { 21 nArray[nCmpIndex]=nTemp; 22 } 23 } 24 } 25 26 void MergeTwoParts(int nArr[],int nPos1,int nPos2,int nPos3) 27 { 28 int nSize=nPos3-nPos1+1; 29 int* nTempArr=new int[nSize]; 30 memset(nTempArr,0,sizeof(int)*nSize); 31 32 int nLeftIndex=nPos1; 33 int nRightIndex=nPos2; 34 35 int nTempIndex=0; 36 37 while(nLeftIndex<nPos2 && nRightIndex<=nPos3) 38 { 39 if (nArr[nLeftIndex]<=nArr[nRightIndex]) 40 { 41 nTempArr[nTempIndex++]=nArr[nLeftIndex++]; 42 } 43 else 44 { 45 nTempArr[nTempIndex++]=nArr[nRightIndex++]; 46 } 47 } 48 49 while (nRightIndex<=nPos3) 50 { 51 nTempArr[nTempIndex++]=nArr[nRightIndex++]; 52 } 53 54 while (nLeftIndex<nPos2) 55 { 56 nTempArr[nTempIndex++]=nArr[nLeftIndex++]; 57 } 58 59 memcpy(nArr+nPos1,nTempArr,nSize*sizeof(int)); 60 61 delete[] nTempArr; 62 } 63 64 void MergeSortViaInsertionSortByWLS(int nArr[],int nStartPos,int nEndPos,int nLenforIS) 65 { 66 // if (nStartPos<nEndPos) 67 // { 68 // int nDivide=(nStartPos+nEndPos)/2; 69 // 70 // MergeSortByWLS(nArr,nStartPos,nDivide); 71 // MergeSortByWLS(nArr,nDivide+1,nEndPos); 72 // 73 // MergeTwoParts(nArr,nStartPos,nDivide+1,nEndPos); 74 // } 75 76 if (nStartPos<nEndPos) 77 { 78 int nDivide=(nStartPos+nEndPos)/2; 79 80 if (nDivide-nStartPos<nLenforIS && nStartPos<nDivide) 81 { 82 InsertionSortByWLS(nArr+nStartPos,nDivide-nStartPos+1); 83 } 84 else 85 { 86 MergeSortViaInsertionSortByWLS(nArr,nStartPos,nDivide,nLenforIS); 87 } 88 89 if (nEndPos-nDivide+1<nLenforIS && nDivide<nEndPos ) 90 { 91 InsertionSortByWLS(nArr+nDivide+1,nEndPos-nDivide); 92 } 93 else 94 { 95 MergeSortViaInsertionSortByWLS(nArr,nDivide+1,nEndPos,nLenforIS); 96 } 97 98 MergeTwoParts(nArr,nStartPos,nDivide+1,nEndPos); 99 } 100 } 101 102 103 int _tmain(int argc, _TCHAR* argv[]) 104 { 105 int nTestArray2[13]={99,35,50,10,101,5,66,100,6,88,22,111,33}; 106 107 MergeSortViaInsertionSortByWLS(nTestArray2,0,12,5); 108 109 for (int i=0;i<13;i++) 110 { 111 cout<<nTestArray2[i]<<" "; 112 } 113 cout<<endl; 114 115 return 0; 116 }
这样应该更好点
1 void MergeSortViaInsertionSortByWLS2(int nArr[],int nStartPos,int nEndPos,int nLenforIS) 2 { 3 if (nStartPos>=nEndPos) 4 { 5 return; 6 } 7 8 if (nEndPos-nStartPos<nLenforIS) 9 { 10 InsertionSortByWLS(nArr,nEndPos-nStartPos+1); 11 } 12 else 13 { 14 int nDivide=(nStartPos+nEndPos)/2; 15 16 MergeSortViaInsertionSortByWLS(nArr,nStartPos,nDivide,nLenforIS); 17 MergeSortViaInsertionSortByWLS(nArr,nDivide+1,nEndPos,nLenforIS); 18 19 MergeTwoParts(nArr,nStartPos,nDivide+1,nEndPos); 20 } 21 }
测试(添加windows.h)
1 int _tmain(int argc, _TCHAR* argv[]) 2 { 3 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}; 4 5 LARGE_INTEGER nBeginTime; 6 LARGE_INTEGER nEndTime; 7 8 QueryPerformanceCounter(&nBeginTime); // 开始计时 9 10 MergeSortViaInsertionSortByWLS(nTestArray2,0,26,9); 11 12 QueryPerformanceCounter(&nEndTime);// 结束计时 13 cout <<nEndTime.QuadPart-nBeginTime.QuadPart<< endl; 14 15 16 for (int i=0;i<27;i++) 17 { 18 cout<<nTestArray2[i]<<" "; 19 } 20 cout<<endl; 21 22 return 0; 23 }