码迷,mamicode.com
首页 > 编程语言 > 详细

算法开篇学习之数组元素查找

时间:2015-06-17 16:40:40      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:c   算法   数据结构   

【摘要】最近两个月都在学习 Linux 驱动,中间碰到了很多问题,进度比较缓慢。尽管不是班科出生的,但是还是觉得算法很有必要学一学。因此将数组元素查找作为自己算法开篇的第一篇博客,好好跟着平凡程序员的博客学习,内容基本是拿来主义。


我们可以下面一个数组查找的函数说起。一句一句写起,首先我们开始从最简单的函数构造开始

int find(int array[], int length, int value)
{
	int index = 0;
	return index;
}

  这里看到,查找函数只是一个普通的函数,那么首先需要判断的就是参数的合法性:

static void test1()
{
	int array[10] = {0};
	assert(FALSE == find(NULL, 10, 10));
	assert(FALSE == find(array, 0, 10));
}

这里可以看到,我们没有判断参数的合法性,那么原来的查找函数应该怎么修改?

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

	int index = 0;
	return index;
}
 看到上面的代码,说明我们的已经对入口参数进行判断了。那么下面就要开始写代码了。

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;
	}

	return FALSE;
}

上面的代码已经接近完整了,那么测试用例又该怎么编写呢?

static void test2()
{
	int array[10] = {1, 2};
	assert(0 == find(array, 10, 1));
	assert(FALSE == find(array, 10, 10));
}
运行完所有的测试用例后,我们看看对原来的代码有没有什么可以优化的地方。其实,我们可以把数组转变成指针。

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

	int* start = array;
	int* end = array + length;
	while(start < end){
		if(value == *start)
			return ((int)start - (int)array)/(sizeof(int));
		start ++;
	}

	return FALSE;
}

如果上面的代码参数必须是通用的数据类型呢?

template<typename type>
int find(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 ((int)start - (int)array)/(sizeof(type));
		start ++;
	}

	return FALSE;
}

新的测试案例

static void test1() //针对于输入数组错误时候
{
	int array[10] = {0};
	assert(FALSE == find<int>(NULL, 10, 10));//数组为空
	assert(FALSE == find<int>(array, 0, 10));//数组没有元素,长度为0
}

static void test2()//正常输入
{
	int array[10] = {1, 2};
	assert(0 == find<int>(array, 10, 1));//元素在第一个位置
	assert(FALSE == find<int>(array, 10, 10));//没有找到
}





算法开篇学习之数组元素查找

标签:c   算法   数据结构   

原文地址:http://blog.csdn.net/xy010902100449/article/details/46534875

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!