前言
最近也没时间刷题。很揪心
分类算法
冒泡排序
- 每次进行两两相比并交换位置,一次外循环能排好一个位置。
- 时间复杂度 O(n^2)
选择性排序
- 一次线性搜索找到最小值,放到最前面
- 时间复杂度O(n^2)
其实和冒泡排序没什么差。
插入排序
- 将左端设做已经排序完毕,然后从未排序的右端依次比较左端的数,直到找到一个比它小的数,然后把它放到这个数的后面,或者直接到最左端。
- 事件复杂度O(n^2)
还是两个循环嘛。
堆排序
- 这个主要是利用了堆的数据结构。堆的数据结构的效果就是“任意顺序添加数据,然后能顺序取出数据”。(堆不能取出中间的某一个元素。这么想一想的话,限制条件少了一个的话,或许就能从现有的方法中找出更高效的方法。)
- 堆,实现优先队列的方式。定义规定,子类数字总是大于其父类。这样取出树的根节点就必然是最小的。怎么实现呢?把一个数放进堆中,先放到最后的叶子节点中,然后比较父类,如果它比较小,就和父类交换,一直到最顶端。
- 思想,我觉得这中间体现了:一个数存两个信息的思想。因为父节点必然是
父节点
和另外的子节点
中最小的,所以和父节点比较就行了。因此相应取数据的时候,也总是要比较两边的数据,其中最小的再放到根节点。 - 时间复杂度:?放入堆中的这个过程的时间复杂度应该怎么计算呢?
并归排序
- 分组,每次分出一半,直到每组只有一个;然后进行合并;只有一个数的时候合并很简单,比较大小,当每组有多个数的时候,依次比较每组的开头数,小的放入;
- 牺牲空间换取时间- -。
快速排序
- 为了找到每个数合适的位置,选中标准数后,左标记放在最左边然后向右移动 找到比标记位大的数。右标记找到比比标记小的数 然后交换 继续移动直到相遇。
- 其过程其实是快速找到标准位应该在的位置。让形如xxxAxxx样式的一串数字,A的数值一定比左边的大,比右边的小。不再是冒泡,选择排序那样,每次固定最小值应该在的位置然后找最小值,而是找到任意一个数应该在的位置。
- 所以如果先移动左边的游标,如果撞到右边的游标了,这个时候其实右边游标还没有排序,(不过其实右边游标上一次有完成过排序的),然后一直撞到标记数,这就说明标记数在的地方是正确的地方了。相反右边的游标如果撞到左边的,因为左边已经完成排序了,都是比标记数小的了,它就没必要再去看了,直接在这个位置和标记数交换。
- 每次完成一次排序之后,分别从它的左右两边排序,这样就避免重复看已经排好的数
- 时间复杂度:O(nlog2n)为什么呢?
搜索算法
列表搜索
线性搜索
未排序的数据,一个个找
二分搜索
已经排好序了,当然不用线性搜索了!,如果不能直接引用的话(比如 1 5 9 11 28 中间找9),就从中间分两半,然后让这个中间数和目标数比较。重复进行。