数据结构与算法--c++实现
因为写的东西很多,记在小本本上已经满足不了我的复习需求了,因此还是决定在这里整理一下(随着我的学习更新),方便以后的查看
数组相关—1
1.二分查找法:
对于一个有序数组(假设为升序),采用二分的方式,查找数组中是否有待查找的元素。以数组arr[5]={4,7,9,12,21}为例。查找方法如下:
·1.首先采用下标,将数组元素分为一半,arr中下标为0~4,因此首先按照 mid=0+4)/2 的方式将数组分为左右两部分,左部分为{4,7},右部分为{9,12 ,21}
2.对比arr[mid]是否等于待查找的数据,若等于直接将mid返回,若不等于,那么要判断arr[mid]与待查找数据谁大,要是arr[mid]大,那么就往mid的左部分查,反之往右部分查。查找的时候重复按照1->2的方式进行找到。直至查到最后一个数也没有找到,就返回-1表示查找失败
接着我们可以分别使用递归与非递归的方式来实现:
递归方式:
int digui(int a[],int data,int left,int right)
{
if (left > right)return -1;
int mid = (left + right) / 2;
if (data == a[mid])
return mid;
if (data > a[mid])
return digui(a, data, mid + 1, right);
else
return digui(a, data, left, mid-1);
}
非递归方式:
int feidigui(int a[],int data,int left,int right)//非递归版本,返回下标
{
while (left<=right)
{
int mid = (left + right) / 2;
if (data == a[mid])
return mid;
if (data > a[mid])
left = mid + 1;
else
{
right = mid - 1;
}
}
return -1;
}
2.使用递归找到一个数组中的最大值----深入递归行为
这个例子是用于深入剖析递归行为的一个例子,实现很简单:
使用类似二分查找的方式,将数组分为二个部分,将这两部分作为递归行为的子问题,最后返回这两部分中较大的一个,代码如下:
int getMax(int *arr,int L,int R)
{if(L==R)return arr[L];
int mid = (L+R)/2;
int left = getMax(arr,L,mid);
int right = getMax(arr,mid+1,R);
return left>right?left:right;
}
通过这个例子来深入理解一个递归行为:具体的递归过程其实就是系统在为我们实现将每个执行过程的函数进行压栈,出栈的过程,以getMax()函数为例,详细过程为:
假设一个数组arr[] = {1,2,3,4};其下标依次为0,1,2,3.当程序从第1行到第3行后,产生一个变量mid = (0+3)/2;然后执行到第4行。此时系统会将本次执行的getMAx的一些"信息"压栈,如:当前执行到第4行,mid=1,L=0,R=3等。如图:
然后从第4行递归进入子过程的getMax(),此时重新从第一行执行到第4行,此时系统会将本次执行的getMAx的一些"信息"压栈,如:当前执行到第4行,mid=(0+1)/2=0,L=0,R=1等,如图:
然后又从子过程的第4行进入孙子过程的getMax(),当执行到第2行时,R=L=0,因此将arr[0]返回到上一层,同时将栈顶的那么getMax弹出,并且让这个getMax接住返回值left=1。因为弹出的getMax函数包含一些“信息”,因此系统通过这些信息可以知道弹出的getMax执行到子过程的第4行。接着系统就可以从第4行向下执行到第5行,此时当前子过程执行的getMax又会产生一些信息,如:left=1,第5行。然后系统将新产生的信息与当前子过程中遗留的信息(如mid=0,L=0,R=1)压栈 如图:
接着从当前子过程的第5行进入孙子过程的getMax,当执行到第2行时,R=L=1,因此将arr[1]=2返回到上一层过程,同时将栈顶的getMax及相关信息弹出,并且让当前子过程接住right=2.因为弹出的getMax函数包含一些“信息”,因此系统通过这些信息可以知道弹出的getMax执行到当前子过程的第5行。接着系统就可以从第5行向下执行到第6行,最后将left与right的最大值返回给父过程,然后出栈,由栈顶信息可知,当前过程执行到第4行,故从当前过程的第4行开始执行,进去第五行,系统将当前过程的getMAx以及一些信息“入栈":如mid=1,行为5,mid=1,L=0,R=3,left=2.
如此递推,整个过程就为递归的实质过程。