今天任务:快排,冒泡,堆排,归并排序,二分查找,二叉树的遍历,二叉树增删查改
晚上回去写总结,算法才是灵魂,数据结构是载体,有功夫的时候把每种算法用不同的数据结构实现一遍,感受下数据结构带给算法的便利。
永远记住:研究算法的设计和性能的主要原因之一:通过提高速度解决其他方法无法解决的问题
冒泡排序
冒泡算法是相邻两元素相互比较,如果顺序相反就交换。这样每次讲最大的或最小的放置好。
轻易可知:比较次数,这是确定的比较次数:(n-1)!
移动次数是一个范围,最多可能移动次数和比较次数一致
简单选择排序
每次循环从全队中找到最小的,把他放在排头。所以确定的要经过n*(n-1)/2次比较,n次交换
从这里看我觉得选择排序要优于冒泡排序,毕竟只需要确定的n次交换
插入算法
保证每次循环之后,左侧都是按照顺序拍好的。
和冒泡算法作比较后,针对部分有序的集合来说(这里说的有序 是指与我们想得到的顺序一致) 插入排序效率优于冒泡排序
最多比较次数:(n-1)!
最多交换次数同样是 (n-1)!
- 注: 截止这里以上的三种方法,都是时间复杂度为n^2级别的
希尔排序
在实现希尔的过程我踩了不少坑。
通过以n为间隔,快速将偏远的小数移动到前列,形成n有序。最终保证n=1,做到全排序。最大化利用插入排序在小范围的优势。
归并排序
两种方法,经典自上而下的方法:使用递归
一种自下而上的方法:使用两个循环嵌套。适合链表的数据结构
还有很多优化手段,比如在面对小数组的时候,使用插入算法进行优化。
在实现归并的过程中,走了很多弯路。我觉得最主要的编程水平不够的原因是,思路不清晰,把要做的一步步想好了,就很顺利。所以核心是理解算法的想法,怎么实现。