面试题目-堆排、快排、二分查找

近期在忙着找工作,由于专业跨度的原因,稍微有些焦头烂额,在方向上有些失衡。有种很奇怪的感觉,我不知道换联网公司到底需要什么样的人才,(/ □ \),好了,吐槽结束了,该继续得还得继续,工作还得继续努力找,希望自己好运吧。

上周面试了一家比较不错的互联网公司,这可能是自己离互联网公司最近的一次了,之前去面过一次爱奇艺,但是,由于对linux下的网络异步通讯这一块不熟,给很快请出来了。。。
感觉这家的氛围和环境我十分喜欢,如果有机会我就去了,不过自己在HR面试时的表现真的很糟糕 - -

排序算法

遗憾的是对于堆排序没有做准备,快排倒是因为经常画画,没有压力,回来了痛心疾首,把程序好好写一遍: 堆排序+快速排序

堆排序

堆排序的思路不再赘述了,直接贴代码吧

template <typename T>
void HeapMentains( T array[], int start, int end )
{
    int lchild = 2*start+1;
    int rchild = lchild+1;
    int large = start;
    if ( lchild <= end && array[start] < array[lchild] )
    {
        large = lchild;
    }
    if ( rchild <= end && array[large] < array[rchild] )
    {
        large = rchild;
    }
    if ( large != start )
    {
        swap( array[large], array[start] );
        HeapMentains( array, large, end );
    }
}

template <typename T>
void HeapSort( T array[], int size )
{
    int end = size - 1;
    int pos = end/2;
    for ( int i=pos; i!=-1; --i )
    {
        HeapMentains( array, i, end );
    }
    for ( int i=end; i!=0; --i )
    {
        swap( array[0], array[i] );
        HeapMentains( array, 0, i-1 );
    }
}

快速排序

template <typename T>
int partition( T array[], int start, int end )
{
    T key = array[end];
    int index = start - 1;
    while ( start != end )
    {
        if ( array[start] < key )
        {
            ++ index;
            swap( array[index], array[start] );
        }
        ++ start;
    }
    ++ index;
    swap( array[index], array[end] );
    return index;
}

template <typename T>
void QuickSort( T array[], int start, int end )
{
    if ( start < end )
    {
        int partition =  Partition( array, start, end );
        QuickSort( array, start, partition-1 );
        QuickSort( array, partition+1, end );
    }
}

二分查找

经典的查找,用递归的方式实现,不容易出错,代码如下:

template <typename T>
int BinarySearch( T array[], int start, int end, T &val )
{
    if ( start <= end )
    {
        int mid =     ( start+end )/2;
        if ( array[mid] == val )
        {
             return mid;
        }
        else if ( array[mid] < val )
        {
             return BinarySearch( array, mid+1, end, val );
        }
        else
        {
            return BinarySearch( array, start, mid-1, val );
        }         
    }
    return -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值