《算法》学习笔记(排序)

基于比较的排序:

基于比较的算法至少使用 lgN! 次比较将长度为N的数组排序。根据斯特灵公式近似得 lgN! ~ NlgN

选择排序

  • 算法:找到数组中最小的元素,与数组第一个元素交换位置;以此类推。
  • 时间复杂度:需要进行 n2/2 次比较,复杂度为 n2
  • 特点:
    (1)运行时间和输入无关。
    (2)数据移动最少,仅需 n 次。

插入排序

  • 算法:(与冒泡类似)假设数组0 i 位已经有序,观察第i+1位,依次与前 i 位比较,找到合适的位置插入这个新元素。
  • 时间复杂度:平均需要n2/4次比较和 n2/4 次交换。最坏需要 n2/2 次比较和 n2/2 次交换,最好需要 n1 次比较和0次交换。
  • 特点:插入排序对部分有序的数组特别高效。

希尔排序

  • 算法:本质是对插入排序的一种改进算法。对于一个较大的间隔h,用插入排序将数组排序为h有序的状态,随后逐步缩小h至1,实现整个数组的排序。实质是将各子数组调整为部分有序状态,为插入排序的高效提供保证。
  • 时间复杂度:取决于h的变化序列。一般可以在 N3/2 以内。
  • 特点:不需要使用额外的空间,代码量小。

归并排序

  • 算法:将两个有序数组归并成一个更大的有序数组。
  • 时间复杂度:归并排序需要 12NlgN NlgN 比较,需要访问数组 6NlgN 次。
  • 特点:空间复杂度较高,访问数组次数较多。

快速排序

  • 算法:每次以一个(往往是任取的)元素为基准,将比它小的元素移到一侧,大的元素移动到另一侧。
  • 时间复杂度:平均需要  2NlnN 次比较,最多需要 N2/2 次比较。
  • 特点:虽然快排比归并排序的标胶次数更多,但移动数据的次数更少,所以往往快速排序的速度更快。对于小数组,快速排序比插入排序慢;对大型数组,经过调整的快速排序往往比其他基于比较的排序算法更快。

优先队列

定义:当一颗二叉树的每个结点都大于等于它的两个子节点,它被称为堆有序
定义:二叉堆是一组能够用堆有序的完全二叉树排序的元素,并在数组中按照层级存储(不使用数组的第一个位置)

堆排序:

  • 算法:分两个阶段,在堆的构造阶段,将数组重新组织安排进一个堆中,然后在下沉排序阶段,从堆中顺序的取出(最大或最小)元素并得到排序结果。
  • 时间复杂度:用下沉操作构造含N个元素的堆只需要少于2N次比较以及N次交换。将这个堆排序,只需要少于 2NlgN 次比较,总共 2NlgN+2N 次比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值