随手小代码——在归并排序中对小数组采用插入排序
2015-07-28 20:01
399 查看
=================================版权声明=================================
[b]版权声明:本文为博主原创文章 未经许可不得转载
[/b]
请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我
未经作者授权勿用于学术性引用。
未经作者授权勿用于商业出版、商业印刷、商业引用以及其他商业用途。
本文不定期修正完善,为保证内容正确,建议移步原文处阅读。 <--------总有一天我要自己做一个模板干掉这只土豆
本文链接:/article/5266591.html
耻辱墙:/article/5266550.html
=======================================================================
这个思考题好奇怪的样子,还是先写写代码吧。
这样应该更好点
测试(添加windows.h)
[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; }
相关文章推荐
- java基础之对象数组
- java用volatile或AtomicBoolean实现高效并发处理 (只初始化一次的功能要求)
- Java集合排序及java集合类详解--(Collection, List, Set, Map)
- Java集合排序及java集合类详解--(Collection, List, Set, Map)
- Python学习笔记-协程
- C++实现二叉树相关操作
- c#生成的word文档,怎么控制选定的内容加下划线而不是整行加下划线
- Installing PyQt5 part2
- JAVA大数练习第三弹
- JAVA大数练习第三弹
- java基础之深入理解Java的接口和抽象类
- 进入不想学习编程的情绪怎么办?
- 基于beego一键创建restful api
- Java设计模式—单例模式和模板模式
- c++只在基类中用虚析构函数的原因
- 既然选择 就要不顾一切地去攀登————记自己学编程之路
- [c、c++]宏中"#"和"##"的用法(zz)
- java.lang.IllegalArgumentException: sheetName '' is invalid
- TinyXML:一个优秀的C++ XML解析器
- Java线程同步:synchronized锁住的是代码还是对象