文章目录
- 冒泡排序
- 选择排序
- 插入排序
- 希尔排序
- 其他
- 有序区
- 时间复杂度(算法复杂度)
虽然不是每个人都会用到算法,但是了解下算法,还是没坏处的。
关于各种排序算法的官方描述太复杂,所以直接用自己的语言。
冒泡排序
就像水里的气泡上浮一样。
相邻的2个元素比较。如果左边的大,就和右边的交换。
效果是什么呢?
第一轮 相当于选老大,一定可以选出最大的,而且会放在最右边。
第二轮 相当于选老二,还是从左到右,因为最右边已经是老大了。所以比到右边第二个即可。
第三轮 选出老三…
第四轮 选出老四…
次数是 n+n-1+n-2 =n(n+1)/2 ,所以算法复杂度是 O(n2)
优点:
是一种最基础的排序,比较好理解,而且稳定。
缺点:
显而易见,算法次数多,而且要交换的次数多。
选择排序
冒泡排序交换次数太多,有没有办法交换次数少点呢,当然有。
每轮都选出最小值,然后和左侧交换。
第一轮 选出最小值,和最左边交换。
第二轮 选出二小值,和左边第二个位置交换。
第三轮 选出三小值…
第四轮 选出四小值…
次数是 n+n-1+n-2 =n(n+1)/2 ,所以算法复杂度是 O(n2)
优点:
和冒泡排序相比,交换次数少了,每轮只有一次交换。
缺点:
虽然快些,但是如果有相同值的元素,前后顺序可能会错位,所以不如冒泡排序稳定。
插入排序
类似于整理扑克牌。
每来一张牌都进行排序,新来的排继续排序。
新牌和有序区从右往左比较,确定位置。这样每轮排序完毕,手里的排都是有序区。
先选最左边的牌为有序区,此时有序区只有一张。
第一轮 拿第二张和有序区从右往左比较,如果小于,继续跟之前的比较,然后确定位置。
第二轮
第三轮 …
第四轮 …
最好情况下(数组本身就是顺序),时间复杂度:O(n)
最坏情况下(数组完全逆序,例如:987654321),时间复杂度:O(n2)
优点:
如果数组顺序本身就是对的,那么只需要n-1次即可。 因为不用进行元素的交换。
缺点:
不是很稳定,如果是逆序,时间复杂度还是O(n)。
希尔排序
略
其他
有序区
有序区是排序中很重要的一个概念。 不同算法有序区很有可能不同。
冒泡排序:
第一轮 有序区是右边第一个
第二轮 有序区是右边第二个 到 最右。
第二轮 有序区是右边第三个 到 最右。
第n轮 有序区是右边第n个 到 最右。
选择排序:
第一轮 有序区是左边第一个
第二轮 有序区是最左 到 左边第二个
第三轮 有序区是最左 到 左边第三个
第n轮 有序区是最左 到 左边第n个。
插入排序:
先选一张为有序区。
第一轮 有序区是最左两张。
第二轮 有序区是最左三张。
第三轮 有序区是最左四张。
第n轮 有序区是最左n+1张。
时间复杂度(算法复杂度)
时间复杂度是算法中最重要的指标,没有之一。
取的是当n趋近于无穷时,最大阶。
一般来说,时间复杂度越高。说明效率越低。
所以努力让时间复杂度降低,是算法师们始终追求的目标。