经典排序算法的设计与实现
来源:互联网 发布:linux永久挂载硬盘 编辑:程序博客网 时间:2024/06/05 17:24
理解技巧:
代码中遇到while(){}
循环时,先考虑跳过循环的情况(即不满足判断条件的情况),以达到简化代码的目的。这样反而能帮助理解while(){}
循环的作用。
关注变量在程序中是否发生变化(或者说有没有被赋值):没有发生,则说明此变量是用来保存重要数据的;发生了,则留心发生了几次变化,分别在哪行执行的。
使用索引是为了遍历。
%取最后一位的数字,/取第一位上的数字。
“++”运算符被称为自增运算符。如果“++”运算符出现在变量的前面(++var),那么在表达式使用变量之前,变量的值将增加1。如果“++”运算符出现在变量之后(var++),那么先对表达式求值,然后变量的值才增加1。同理自减运算。
保存一下堆排序的算法
void HeapAdjust(Sqlist &L, int s, int m){//调整L.key[s]使L.key[s....m]成为一个大顶堆 int rc, j; rc = L.key[s]; //97 for (j = 2 * s; j <= m; j *= 2) { if (j<m&&L.key[j]<L.key[j + 1]) j++; //这一句的判断,保证j为,两个子树上key较大的记录的下标(如果是两颗子树的话) if (!(rc<L.key[j])) break; //注意:优先级问题,须在!后加括号 L.key[s] = L.key[j]; s = j; } L.key[s] = rc;}void HeapSort(Sqlist &L){//堆排序。时间复杂度为O(nlog2n) int i; for (i = L.length / 2; i > 0; i--) HeapAdjust(L, i, L.length); //将L.key[1...L.length]建成大顶堆 for (i = L.length; i>1; i--) { SWAP(L.key[1], L.key[i]); //最后一个记录相互交换 HeapAdjust(L, 1, i - 1); //将L.key[1...i-1]重新调整为大顶堆 }}
这里有个巨大的bug,内存中的length似乎被 L.key[s] = rc
赋值的时候直接被覆盖了。
0 0
- 经典排序算法的设计与实现
- 算法设计与分析 合并排序的递归实现算法
- 算法设计与分析 快速排序的递归实现算法
- 经典排序算法总结与实现
- 经典排序算法总结与实现
- 经典排序算法总结与实现
- 经典排序算法总结与实现
- 经典排序算法总结与实现
- 经典排序算法总结与实现
- 经典排序算法总结与实现
- 【算法设计】合并排序、自然合并排序与快速排序算法的Java实现
- 经典排序算法实现
- 多种排序算法基于web演示的设计与实现
- 经典排序算法的VC实现
- 经典排序算法的VC实现
- Java 实现的经典排序算法
- C#实现所有经典的排序算法
- java实现的经典排序算法
- css3中skew与rotateX(),rotateY()的用法
- SQLite数据库简介
- 无线轮播ViewPager封装类
- GCD
- Hibernate4.0取消hibernate template的原因
- 经典排序算法的设计与实现
- GitHub for Windows
- java 递归获取一个目录下的所有文件路径
- 设置控件背景为透明或者半透明 - Android
- 一名设计师,要具备的知识管理思维(二)
- 数据库的增删改查
- 由二叉树的前序遍历和后续遍历结果还原二叉树,并后序遍历打印
- 【caffe源码研究】第二章:使用篇(2):tools
- iOS 修改同一套图的颜色