归并排序(MergeSort)
2016-04-03 00:34
363 查看
一. 背景与目的
进行归并排序的练习。学习分治思想。
算法验证:
第一步:对数组A[1…N]进行中分,直到每两个元素一组。
第二步:对于每个划分进行合并,按大小合并。合并成一个有序数组。依次递归。
第三步:对A[1…M],A[M+1…N]进行合并,则A[1…N]是一个有序数组。算法证明完毕。
二. 代码实现
实现代码:
输出结果
三. 遇到问题
1、释放内存放在循环里面,导致进程死掉。
2、分支思想还是没有深入内心,用起来中有一种摸不着是否正确的感觉,感觉这是一种黑盒算法。
四. 总结
1、释放内存,不能多次释放同一个内存,否则报内存错误。
2、分治思想,就在于相同的操作进行递归嵌套。
3、该算法空间效率为Nlog2(n),为什么这样。查看每一次合并都是需要N个额外内存,划分层次为log2(N)。时间效率为:Nlog2(N),算法稳定。
五. 后续计划
1、进行非比较排序练习
六. 参考文献
1、算法导论
2、 八大排序算法 http://blog.csdn.net/abcbig/article/details/42774333
95c9
进行归并排序的练习。学习分治思想。
算法验证:
第一步:对数组A[1…N]进行中分,直到每两个元素一组。
第二步:对于每个划分进行合并,按大小合并。合并成一个有序数组。依次递归。
第三步:对A[1…M],A[M+1…N]进行合并,则A[1…N]是一个有序数组。算法证明完毕。
二. 代码实现
实现代码:
//归并排序 void MergeSort(T testArray[],int nSize){ LogInfo<T> log = LogInfo<T>(); log.ShowState("原始数组为:"); log.ShowArray(testArray, nSize); MergeSortSub(testArray, 0, nSize - 1); log.ShowState("最终数组为:"); log.ShowArray(testArray, nSize); } //归并排序 void MergeSortSub(T testArray[], int Begin,int End){ if (Begin < End){ int Pivot = (Begin + End) / 2; MergeSortSub(testArray, Begin, Pivot); MergeSortSub(testArray, Pivot + 1, End); Merge(testArray, Begin, Pivot, End); } } //归并排序合并过程 void Merge(T testArray[], int Begin,int Pivot, int End){ int nLeft = Pivot - Begin+1; int nRight = End - Pivot; //产生两个数组,并复制值。 T* testLeft = new T[nLeft]; T* testRight = new T[nRight]; int i(0), j(0); for (i = 0; i < nLeft; i++) testLeft[i] = testArray[Begin + i]; for (j = 0; j < nRight; j++) testRight[j] = testArray[Pivot + j + 1]; i = 0, j = 0; for (int k = Begin; k <= End; k++){ //左右两边元素都没放置完 if (i < nLeft && j < nRight){ if (testLeft[i] < testRight[j]){ testArray[k] = testLeft[i++]; } else{ testArray[k] = testRight[j++]; } } else{ //左边元素没有放置完 if (i<nLeft){ testArray[k] = testLeft[i++]; } else{ testArray[k] = testRight[j++]; } } } delete[] testLeft; delete[] testRight; }
输出结果
三. 遇到问题
1、释放内存放在循环里面,导致进程死掉。
2、分支思想还是没有深入内心,用起来中有一种摸不着是否正确的感觉,感觉这是一种黑盒算法。
四. 总结
1、释放内存,不能多次释放同一个内存,否则报内存错误。
2、分治思想,就在于相同的操作进行递归嵌套。
3、该算法空间效率为Nlog2(n),为什么这样。查看每一次合并都是需要N个额外内存,划分层次为log2(N)。时间效率为:Nlog2(N),算法稳定。
五. 后续计划
1、进行非比较排序练习
六. 参考文献
1、算法导论
2、 八大排序算法 http://blog.csdn.net/abcbig/article/details/42774333
95c9
相关文章推荐
- html
- Android studio出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"的解决办法
- 数据加密原理
- 0.Win8.1,Win10,Windows Server 2012 安装 Net Framework 3.5
- 关于sublime的一些使用方式
- CTF——你关注最新的漏洞吗
- 一步一步利用django创建博客应用(三)
- ssh整合context:component-scan包名写了*号:Failed to parse configuration class [org.springframework.cache.aspectj.AspectJJCacheConfiguration]
- swift系统自带二维码的生成
- 数据库原理(一)—— 关系代数(二)
- apache版本的hadoop源码编译
- C#-变量类型(值类型、引用类型)
- MindManger 2016 64位 破解版
- u-boot-2016.03在mini2440移植 之DM9000
- VS
- MySQL 数据库学习笔记1
- 数据库原理(一)—— 关系代数
- C# 服务器、客户端学习(四)
- C++中慎用逐位拷贝(bitwise copy)的函数
- [Commons]——迭代器