今天晚上接到深圳默齐致知hr的电话面试。问了三个问题:
1.堆排序
2.快速排序
3.java中抽象类和接口的区别
1.堆排序
void Heapfy(int A[],int idx,int max) //建立最大堆
{
int left=idx*2+1;
int right=left+1;
int largest=idx;
if(left<max&&A[left]>A[idx]){largest=left;}
if(right<max&&A[largest]<A[right]){largest=right;}
if(largest!=idx)
{
int temp=A[largest]; //较大的节点值将交换到其所在节点的父节点
A[largest]=A[idx];
A[idx]=temp;
Heapfy(A,largest,max); //递归遍历
}
}
void buildHeap(int A[],int ll)
{
int len=ll;
for(int i=len/2-1;i>=0;--i)
{
Heapfy(A,i,len); //建立最大堆,将堆中最大的值交换到根节点
}
for(int i=len-1;i>=1;--i)
{
int temp=A[0]; //将当前堆的根节点交换到堆尾的指定位置
A[0]=A[i];
A[i]=temp;
Heapfy(A,0,i); //建立下一次的最大堆
}
}
2.快速排序
#include<iostream>
using namespace std;
void quickSort(int a[],int,int);
int main()
{
int array[]={34,65,12,43,67,5,78,10,3,70},k;
int len=sizeof(array)/sizeof(int);
cout<<"The orginal arrayare:"<<endl;
for(k=0;k<len;k++)
cout<<array[k]<<",";
cout<<endl;
quickSort(array,0,len-1);
cout<<"The sorted arrayare:"<<endl;
for(k=0;k<len;k++)
cout<<array[k]<<",";
cout<<endl;
system("pause");
return 0;
}
void quickSort(int s[], int l, int r)
{
if (l< r)
{
int i = l, j = r, x = s[l];
while (i < j)
{
while(i < j && s[j]>= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i]< x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x;
quickSort(s, l, i - 1); // 递归调用
quickSort(s, i + 1, r);
}
}
3.java中接口与抽象类的关系
含有abstract修饰符的class 即为抽象类,abstract类不能创建实例对象,含有abstract的方法的类必须定义为abstract class ,abstract class 里的方法不必是抽象的,抽象来中定义抽象方法必须放在具体子类中实现,所以呀,不能有抽象的构造方法或抽象的静态方法,如果子类没有实现抽象父类中的所有 方法,那么,子类也必须定义为抽象类。
接口(interface)可以说成是抽象类的特例。接口中的所有方法都必须是抽象的,接口中的方法定义默认为public abstract 。接口中的变量是全局常量,即public static final修饰的。
看一下他们在语法上的区别吧!
1,抽象类里可以有构造方法,而接口内不能有构造方法。
2,抽象类中可以有普通成员变量,而接口中不能有普通成员变量。
3,抽象类中可以包含非抽象的普通方法,而接口中所有的方法必须是抽象的,不能有非抽象的普通方法。
4,抽象类中的抽象方法的访问类型可以是public ,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5,抽象类中可以包含静态方法,接口内不能包含静态方法。
6,抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static类型,并且默认为public static类型。
7,一个类可以实现多个接口,但只能继承一个抽象类。
再补充点两者在应用上的区别:
接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的通信,而抽象类在代码实现方面发挥作用,可以实现代码的重用