文章目录

  • ​​冒泡排序​​
  • ​​选择排序​​
  • ​​插入排序​​
  • ​​希尔排序​​
  • ​​其他​​
  • ​​有序区​​
  • ​​时间复杂度(算法复杂度)​​


虽然不是每个人都会用到算法,但是了解下算法,还是没坏处的。


关于各种排序算法的官方描述太复杂,所以直接用自己的语言。

冒泡排序

就像水里的气泡上浮一样。
相邻的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趋近于无穷时,最大阶。

一般来说,时间复杂度越高。说明效率越低。
所以努力让时间复杂度降低,是算法师们始终追求的目标。