0
点赞
收藏
分享

微信扫一扫

《数据结构与算法之美》03 排序和查找

老北京的热干面 2022-04-14 阅读 68

一、递归

递归是一种应用非常广泛的算法(或者编程技巧)。

int f(int n) {
  if (n == 1) return 1;
  return f(n-1) + 1;
}

二、排序

排序算法太多了,最常用的有冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。

冒泡排序(Bubble Sort)

每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。

插入排序(Insertion Sort)

插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。

选择排序(Selection Sort)

选择排序算法的实现思路有点类似插入排序,但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾。

归并排序(Merge Sort)

归并排序使用的就是分治思想。

快速排序(Quick Sort)

快排的思想是:如果要排序从 p 到 r 之间的一组数据,选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。

归并排序算法是一种在任何情况下时间复杂度都比较稳定的排序算法,这也使它存在致命的缺点,即归并排序不是原地排序算法,空间复杂度比较高,是 O(n)。正因为此,它也没有快排应用广泛。

三、二分查找

二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。二分查找的时间复杂度为 O(logn) 。

logn 是一个非常“恐怖”的数量级,即便 n 非常非常大,对应的 logn 也很小。

转载请并标注: “本文转载自 linkedkeeper.com (文/张松然)” 

举报

相关推荐

0 条评论