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

【摘要】最近两个月都在学习 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));//没有找到
}
时间: 2024-10-13 22:44:37

算法开篇学习之数组元素查找的相关文章

数组元素查找(查找指定元素第一次在数组中出现的索引)

import java.util.Scanner; /* * 需求:数组元素查找(查找指定元素第一次在数组中出现的索引) * (1)给定数组int[] arr={5,7,3,2,5} * (2)要查询的元素通过键盘录入的方式确定 * (3)定义一个查找数组元素第一次出现位置的方法(注:要查找的元素就是键盘录入的数据) * *分析: * A:定义数组int[] arr={5,7,3,2,5}; * B:键盘录入一个被查询的数据 * C:写方法实现查找指定元素在数据中第一次出现的索引 * 遍历数组,

C++类的数组元素查找最大值问题

找出一个整型数组中的元素的最大值. 1 /*找出一个整型数组中的元素的最大值.*/ 2 3 #include <iostream> 4 using namespace std; 5 6 class ArrayMax //创建一个类 7 { 8 public : 9 void set_value(); 10 void max_value(); 11 void show_value(); 12 13 private: 14 int array[10]; 15 int max; 16 }; 17 1

(算法)旋转有序数组中查找某个数

题目: 假设有个有序数组在某个位置旋转,得到新的数组,即为旋转有序数组.如:(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). 现给定一个这样的数组,在数组中查找某个数.如果找到,返回下标,否则返回-1: 思路: 思路1: 考虑一个旋转有序数组的特点:前面部分是递增的,后面部分也是递增的,即先后两部分都为递增有序数组,因此可以用二分查找来做. 假设数组为A,下标从left到right,查找的数字为target,那么mid=(left+((right

C++算法之 二维数组的查找

题目:在一个二维数组当中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组 和一个整数,判断数组当中是否含有该整数. 思路: 1   2   8     9 2   4   9    12 4   7   10  13 6   8   11  15 每一行递增,如果右上角的数字小于要找的数字,那么这一行所有的数字都小于要找的数字: 每一列递增,如果右上角的数字大于要找的数字,那么这一列所有的数字都大于要找的数字: bool Find(

《数据结构、算法与应用》8.(顺序查找数组中第一个出现指定元素的位置)

最近在读<数据结构.算法与应用>这本书,把书上的习题总结一下,用自己的方法来实现了这些题,可能在效率,编码等方面存在着很多的问题,也可能是错误的实现,如果大家在看这本书的时候有更优更好的方法来实现,还请大家多多留言交流多多指正,谢谢 8. 从左至右检查数组a[0:n-1]中的元素,以查找雨x相等的那些元素.如果找到一个元素与x相等,则函数返回x第一次出现所在的位置.如果在数组中没有找到这样的元素,函数则返回-1. // // main.cpp // Test_08 // // Created

【算法导论学习-015】数组中选择第i小元素(Selection in expected linear time)

1.算法思想 问题描述:从数组array中找出第i小的元素(要求array中没有重复元素的情况),这是个经典的"线性时间选择(Selection in expected linear time)"问题. 思路:算法导论215页9.2 Selection in expect linear time 2.java实现 思路:算法导论216页伪代码 /*期望为线性时间的选择算法,输入要求,array中没有重复的元素*/ public static int randomizedSelect(i

【算法练习题】力扣练习题——数组(6): 在有序数组中查找元素存在的范围

原题说明:给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [-1, -1]. 原题链接:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array 题目分析: 这道题目当然也是用二分查找来解题.经过上道题的教训,这次我详细考察了各个

【算法导论学习-016】两个已排过序的等长数组的中位数(median of two sorted arrays)

问题来源 <算法导论>P223 9.3-8: Let X[1..n] and Y[1..n] be two arrays, each containing nnumbers already in sorted order. Give an O(lgn)-time algorithm to find themedian of all 2n elements in arrays X and Y. 翻译过来即:求两个等长(n个元素)的已排序数组A和B的中位数 方案1:对两个数组进行归并直到统计到第n

【算法31】寻找数组的主元素(Majority Element)

题外话 最近有些网友来信问我博客怎么不更新了,是不是不刷题了,真是惭愧啊,题还是在刷的,不过刷题的频率没以前高了,看完<算法导论>后感觉网上很多讨论的题目其实在导论中都已经有非常好的算法以及数学证明,只是照搬的话好像意义也不是很大,希望找到些有代表性的题目在更新,另外希望能接着前面的<穷举递归和回溯算法终结篇>一系列如动态规划.贪心算法类的终结篇,在梳理自己知识结构的同时也能够帮助读者们更系统的学习算法思想.好了话不多说,进入正题. 问题描述 给定一个数组A[n], 定义数组的主元