重新教自己学算法之开篇(一)

目前在读大三,面临找工作。经同学面试笔试经验得知,多以算法为主。而自我感觉算法仍然欠缺,打算重新学一遍经常用的算法。因此根据csdn博主feixiaoxing的文章一步一步学习,并坚持每天至少一篇文章,在文章中尽量加入自己的代码和注解,希望能尽快完成算法的回顾。

今天是有关一个数组的查找,比较简单。代码和注解如下:

#include 
#include 
using namespace std;

int find(int array[], int length, int value){
    if(NULL == array || 0 == length)
        return false;

    //用下标实现查找
    /*int index = 0;
    for(;index < length; index++){
        if(value == array[index])
            return index;
    }*/

    //用指针实现查找,进行优化
    int *start = array;
    int *end = array + length;
    while(start < end){
        if(value == *start)
            return start - array;
        start++;
    }
    return false;
}

//参数是通用的数据类型
template<typename type>
int find_2(type array[], int length, type value)
{
    if(NULL == array || 0 == length){
        return false;
    }
    type *start = array;
    type *end = array + length;
    while(start < end){
        if(value == *start)
            return start - array;
        start++;
    }
    return false;
}



static void test()
{
    int array[10] = {1,2};
    assert(0 == find(array,10,1));
    assert(false == find(array,10,10));

}
static void test1()
{
    int array[10] = {0};
    assert(false == find_2<int>(NULL,10,10));
    assert(false == find_2<int>(array,0,10));

}
static void test2()
{
    int array[10] = {1,2};
    assert(0 == find_2<int>(array,10,1));
    assert(false == find_2<int>(array,0,10));
}
int main(int argc, char const *argv[])
{
    test();
    test1();
    test2();
    return 0;
}

(代码调试已通过)
总结:
1:知道了测试用例的重要性,没有测试用例保证的代码(尽量完备)只是一段无序的字符而已,没有什么价值。
2:一定要进行函数参数的合法性判断,见函数find();
3:assert函数:

#include
void assert(int expression);

作用:计算表达式experssion,如果其值为假(0),那么闲打印出一条出错信息,然后通过调用abort来终止程序运行。
4:代码中find()函数,为了对代码进行优化,将数组改为了指针。原因:数组的访问需要三步:获取基地址、偏移值、取值,而如果指针可以随index移动的话,那么数据的访问只需要取值这样一个步骤即可。
5:关注指针的运算是基础知识,一定要弄得懂。
6:代码中还用到template模板,可参见c++ primer 16章,模板与泛型编程。
6:算法都需要测试用例的验证,
任何优化都要建立在测试的基础之上,
测试和代码的编写要同步进行,
算法的成功运行时一步一步进行,每一步的成功都必须建立在前一步的基础之上。

你可能感兴趣的:(重新学算法)