面试中常用的算法——排序

学习算法的好处
学习算法的过程其实是一个提高思维能力的过程。

基本的排序算法(简单直接帮助迅速写出没有bug的代码)
冒泡排序/Bubble Sort
插入排序/Insertion Sort

常考的排序算法(解决绝大部分设计排序问题的关键)
归并排序/Merge Sort
快速排序/Quick Sort
拓扑排序/Topological Sort

其他排序算法(掌握好它的解题思想能开阔解题思路)
堆排序/Heap Sort
桶排序/Bucket Sort

冒泡排序

冒泡排序的算法思想
每一轮,从杂乱无章的数组头部开始,每两个元素比较大小并进行交换;
直到这一轮当中最大或最小的元素被放置在数组的尾部;
然后,不断地重复这个过程,直到所有元素都排好位置。

冒泡排序空间复杂度:O(1)
假设数组的元素个数是n,整个排序的过程中,直接在给定的数组里进行元素的两两交换。

冒泡排序的时间复杂度:O(n^2)
情景一:给定的数组按照顺序已经排好
只需要进行n-1次的比较,两两交换次数为0,时间复杂度是O(n),这是最好的情况。

情景二: 给定的数组按照逆序排列
只需要进行n(n-1)/2次比较,时间复杂度是O(n^2),这是最坏的情况。

情景三:给定的数组杂乱无章
在这种情况下,平均时间复杂度是O(n^2)。

冒泡排序是一种稳定的排序算法,所谓的稳定,也就是说,对于数组里两个相等的数,经过排序后这两个数的相对位置保持不变。

插入排序

插入排序与冒泡排序的对比
在冒泡排序中,经过每一轮的排序处理后,数组后端的数是排好序的;
在插入排序中,经过每一轮的排序处理后,数组前段的数都是排好序的。

插入排序的算法思想
不断地将尚未排好序的数插入到已经排好序的部分。

插入排序的空间复杂度:O(1)
假设数组的元素个数是n,整个排序的过程中,直接在给定的数组里进行元素的两两交换。

插入的时间复杂度:O(n^2)
情景一:给定的书库按照顺序已经排好
只需要进行n-1次的比较,亮亮交换次数为0,时间复杂度是O(n),这是最好的情况。
情景二:给定的数组按照逆序排列
需要进行n(n-1)/2次比较,时间复杂度是O(n^2),这是最坏的情况。
情景三:给定的数组杂乱无章
在这种情况下,平均时间复杂度是O(n^2)

插入排序也是一种稳定的排序算法

归并排序

分治的思想
归并排序的核心思想是分治,把一个复杂问题拆分成若干个子问题来求解。

归并排序的算法思想
把数组总中间划分成两个子数组;
已知递归地把子数组划分成更小的子数组,直到子数组里面只有一个元素;
依次按照递归的返回顺序,不断地合并排好序的子数组,直到最后把整个数组的顺序排好。

归并排序的时间复杂度: T(n)
归并算法是一个不断递归的过程,假设数组的元素个数是n。
时间复杂度是T(n)的函数:T(n)=2*T(n/2) + O(n)
如何解这个公式?
对于规模为n的问题,一共要进行log(n)层的小大切分;
每一层的合并复杂度都是O(n)
所以整体的复杂度就是O(nlogn)

归并排序的空间复杂度:O(n)
由于合并n个元素需要分配一个大小为n的额外数组,合并完成之后,这个数组的空间就会被释放。

归并排序也是稳定的排序算法。

快速排序

快速排序的算法思想
快速排序也采用了分治的思想;
把原始的数组筛选成较小和较大两个子数组,然后递归地排序两个子数组;
在分成较小和较大的两个子数组过程中,如何选定一个基准值尤为关键。

需要注意的是:
快速排序是直接在原始数组里进行各种操作的,所以当子数组被分割出来时,原始数组里的排序也被改变了。

快速排序最优情况下的时间复杂度
T(n)=2*T(N-1)+O(n)

O(n)的由来:
把规模大小为n的问题分解成n/2的两个子问题;
和基准值进行n-1次比较,n-1次的比较的复杂度就是O(n)
这种情况下快速排序的复杂度也是O(nlogn)

快速排序最复杂的情况
每次在选择基准值的时候,都不幸选择了子数组里的最大或最小值
其中一个子数组长度为1
另一个长度只比父数组少1
此时的情况类似于冒泡排序,这意味着在最坏情况下快速排序的时间复杂度为O(n^2)
然而,可以通过随机地选取基准值就可以避免这种最坏的情况

快速排序的空间复杂度:O(logn)
和归并排序不同快速排序再每次递归的过程中
只需要开辟O(1)的存储空间来完成交换操作实现直接对数组的修改
而递归次数为logn,所以它的整体空间复杂度完全取决于压堆栈的次数。

拓扑排序

拓扑排序的应用场合
拓扑排序就是要将图论里的顶点按照相连的性质进行排序

拓扑排序的前提
必须是有向图
图里没有环

拓扑排序的时间复杂度:O(n)
统计顶点的入度需要O(n)的时间
接下来每个顶点被遍历一次,同样需要O(n)的时间

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章