面试常见问题——数据结构与算法(一)
目录:
- 快速排序、堆排序、希尔排序、冒泡排序、归并排序、简单选择排序、直接插入排序、基数排序的思想
- 稳定排序
- 哈夫曼编码
- 回溯法的基本思想
- 求k的n次幂的方法以及时间复杂度
- 对称加密算法和非对称加密算法、数字签名
- Prim、Kruskal最小生成树算法
- Dijkstra单源最短路径算法
- 如何寻找单链表的中间结点
- 谈谈对动态规划算法的理解
1、快速排序、堆排序、希尔排序、冒泡排序、归并排序、简单选择排序、直接插入排序、基数排序的思想
- 交换排序(快速排序、冒泡排序):根据序列中两个元素的比较结果来对换这两个记录在序列中的位置
- 快速排序
- 思想:分治的思想,把大的拆分为小的,小的再拆分为更小的
- 原理:对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前部分的所有记录均比后部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止。
- 快速排序与主元的选择有关,如果选择子序列左侧第一个元素比较,那么第一个元素最好是大小居中的,以使得分成的两个子数组长度大致相等,性能才能最佳。否则,在序列初始有序的情况下,快速排序退化成冒泡排序,时间复杂度会退化到O(n²),它是一种不稳定的排序算法。
- 一趟快排:首先确定分界元素pivot,接着用两个指针low和high,它们分别指向待排序数组首尾元素。然后从high所指的位置起向左搜索找到第一个小于pivot的元素并与pivot交换,然后从low开始向右搜索第一个大于pivot的元素并与pivot交换,重复这两个步骤,直到low == high为止
- 空间效率:递归栈的平均深度O(logn),空间复杂度最坏情况下O(n),平均情况下O(logn)
- 时间效率:
- 与划分是否对称有关
- 最坏O(n²),最好O(nlogn)
- 冒泡排序
- 思想:临近的元素两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟排序后,最大或最小的元素被交换到了最后一位,针对所有的元素重复以上的步骤,每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
- 在序列初始有序的情况下,增加交换标志flag可将时间复杂度降到O(n)
- 空间效率:O(1)
- 时间效率:O(n²)
- 快速排序
- 插入排序(直接插入排序、希尔排序):每次将一个待排序的记录按其关键字大小插入到前面已经排好序的子序列中,直到全部记录插入完成
- 直接插入排序
- 思想:每一步从无序序列中取出一个待排序的元素,插入到前面已经排好序的一组元素的适当位置中,直到元素全部插入为止。
- 空间效率:O(1)
- 时间效率:O(n²)
- 希尔排序(分组插入排序、缩小增量排序)
- 思想:先将整个待排元素分割成若干个子序列,这些子序列由相隔某个增量的元素组成,分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
- 空间效率:O(1)
- 时间效率:O(n²)
- 直接插入排序
- 选择排序(简单选择排序、堆排序):每一趟(如第i趟)在后面n - i + 1个待排序元素中选取关键字最小的元素,作为有序子序列的第i个元素,直到第i - 1趟做完,待排序元素只剩下一个,就不用再选了。
- 简单选择排序
- 思想:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个位置的记录进行交换;接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录并与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有一个时为止。
- 空间效率:O(1)
- 时间效率:O(n²)
- 堆排序
- 思想:对于给定的n个记录,初始时把这些记录看作一棵顺序存储的二叉树,然后将其调
- 简单选择排序