目前在读大三,面临找工作。经同学面试笔试经验得知,多以算法为主。而自我感觉算法仍然欠缺,打算重新学一遍经常用的算法。因此根据csdn博主feixiaoxing的文章一步一步学习,并坚持每天至少一篇文章,在文章中尽量加入自己的代码和注解,希望能尽快完成算法的回顾。
今天是有关一个数组的查找,比较简单。代码和注解如下:
#include <iostream>
#include <cassert>
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<cassert>
void assert(int expression);
作用:计算表达式experssion,如果其值为假(0),那么闲打印出一条出错信息,然后通过调用abort来终止程序运行。
4:代码中find()函数,为了对代码进行优化,将数组改为了指针。原因:数组的访问需要三步:获取基地址、偏移值、取值,而如果指针可以随index移动的话,那么数据的访问只需要取值这样一个步骤即可。
5:关注指针的运算是基础知识,一定要弄得懂。
6:代码中还用到template模板,可参见c++ primer 16章,模板与泛型编程。
6:算法都需要测试用例的验证,
任何优化都要建立在测试的基础之上,
测试和代码的编写要同步进行,
算法的成功运行时一步一步进行,每一步的成功都必须建立在前一步的基础之上。