先以老师上课所讲的经典面试题:
1.把两个排好序的数组,合并为一个数组,第一个数组后半部分刚好可以容纳第一个数组的元素,空间复杂度O(1)
解析:由于空间复杂度要求,所以不可再开一个temp数组之类的方法。
void sort(int Array1[],int n,int Array2[],int m)
{
int p1=n-1,p2=m+n-1;
int t=m-1;
while(p1!=p2)
{
if(p1==-1)
{
Array1[p2]=Array2[t];
break;
}
if(Array2[t]>=Array1[p1])
Array1[p2--]=Array2[t--];
else
{
Array1[p2--]=Array1[p1--];
}
}
2.假设数组已经排好序,即如果把数组排好序,每个元素移动的距离不超过k,并且k相对于数组长度来说很小,请问选择什么排序法比较好。
3.判断数组中是否有重复值,空间复杂度为O(1)
4.荷兰国旗问题,对只包含0,1,2的整数数组进行排序,时间复杂度O(N),空间复杂度O(1)
解析:三个指针
5.在行和列都排好序的矩阵中找给定的数,时间复杂度O(M+N)
如:
0 1 2 5
2 3 4 7
4 4 4 8
5 7 7 9
解析:右上角开始,找稍大向下走,找稍小向左走
6.在给定数组中,找到中间需要排序的子数组,时间复杂度O(N),空间复杂度O(1)
如:1 3 5 6 4 7 2 8 9中子数组5 6 4 7 2需要排序
这一章的重点就是八大排序,根据以往考题,主要考察每个算法的执行过程,思想,方法以及时间(平均,最好,最坏),空间复杂度(辅助空间),以及通过理解每个算法来判断算法的稳定性(直接记住也行),考题里倒是没怎么涉及对每个算法代码的书写。
八大排序详解推荐这个超高阅读量帖子:
https://blog.csdn.net/hguisu/article/details/7776068
希尔排序的最好时间为n1.3次幂~n1.5次幂
自己的理解:
以下代码来自数据结构与算法分析(第三版)电子工业出版社
1.插入排序:从第二个开始,向之前序列插入当前元素,放在之前序列的正确位置
template<typename E,typename Comp>
void insertionsort(E A[],int n){
for(int i=1;i<=n;i++) //插入第i个元素
for(int j