二分查找算法,斐波那契数列的递归及非递归。(分析时间复杂度及空间复杂度)
2017-12-08 14:53
288 查看
二分查找的非递归与递归实现:
#include<stdio.h>
int binarry_Search(int arr[], int len, int value){ //采用左闭右闭区间方式
int left=0,right=len-1;
int mid;
while(left<=right){
mid=left+((right-left)>>1); //(left+right)/2;
if(value<arr[mid]){
right=mid-1;
}
else if(value>arr[mid]){
left=mid+1;
}
else{
return mid;
}
}
return -1;
}
int binarry_Search2(int arr[], int len, int value){ //采用左闭右开区间方式
int left=0,right=len;
int mid;
while(left<right){
mid=left+((right-left)>>1); //(left+right)/2;
if(value<arr[mid]){
right=mid;
}
else if(value>arr[mid]){
left=mid+1;
}
else{
return mid;
}
}
return -1;
}
//使用非递归的时间复杂度为:O(logN),倒过来分析,比如一个数通过二分查找要找三次找到,那么这个有序数组的个数为2^3=8,则次数 time=logN;
//空间复杂度为:O(1),创建的临时变量为常数个;
int recur_bin_Search(int arr[],int left,int right,int value){ //使用递归实现二分查找
int mid;
if(left<right){
mid=left+((right-left)>>1);
if(value<arr[mid]){
right=mid;
return recur_bin_Search(arr,left,right,value);
}
else if(value>arr[mid]){
left=mid+1;
return recur_bin_Search(arr,left,right,value);
}
else{
return mid;
}
}
return -1;
}
//递归方式的时间复杂度:函数每次执行的时间复杂度为O(1),执行递归的次数同非递归的二分查找次数,故时间复杂度也是O(logN);
//空间复杂度:O(1);
int main(){
int arr[]={1,3,5,6,7,8};
int len=sizeof(arr)/sizeof(int);
int m=recur_bin_Search(arr,0,len,8);
printf("%d\n",m);
return 0;
}
斐波那契
#include<stdio.h>
int fibona(int n){ //迭代法
int a=0,b=1,m;
if(n<2){
return n;
}
while(n-->1){
m=a+b;
a=b;
b=m;
}
return m;
}
//时间复杂度为:O(N);空间复杂度为:O(1);
int fibona_recur(int n){ //递归
if(n<2){
return n;
}
else{
return fibona_recur(n-1)+fibona_recur(n-2);
}
}
//时间复杂度:O(2^n) 空间复杂度为:O(1);
int fibona_tail_recur(int n,int a,int b){
if(0==n){
return a;
}
else{
fibona_tail_recur(n-1,b,a+b);
}
}
//时间复杂度为:O(N);空间复杂度为:O(1);
int main(){
int i=0;
for(i;i<12;i++){
int m=fibona_tail_recur(i,0,1);
printf("%d ",m);
}
return 0;
}
#include<stdio.h>
int binarry_Search(int arr[], int len, int value){ //采用左闭右闭区间方式
int left=0,right=len-1;
int mid;
while(left<=right){
mid=left+((right-left)>>1); //(left+right)/2;
if(value<arr[mid]){
right=mid-1;
}
else if(value>arr[mid]){
left=mid+1;
}
else{
return mid;
}
}
return -1;
}
int binarry_Search2(int arr[], int len, int value){ //采用左闭右开区间方式
int left=0,right=len;
int mid;
while(left<right){
mid=left+((right-left)>>1); //(left+right)/2;
if(value<arr[mid]){
right=mid;
}
else if(value>arr[mid]){
left=mid+1;
}
else{
return mid;
}
}
return -1;
}
//使用非递归的时间复杂度为:O(logN),倒过来分析,比如一个数通过二分查找要找三次找到,那么这个有序数组的个数为2^3=8,则次数 time=logN;
//空间复杂度为:O(1),创建的临时变量为常数个;
int recur_bin_Search(int arr[],int left,int right,int value){ //使用递归实现二分查找
int mid;
if(left<right){
mid=left+((right-left)>>1);
if(value<arr[mid]){
right=mid;
return recur_bin_Search(arr,left,right,value);
}
else if(value>arr[mid]){
left=mid+1;
return recur_bin_Search(arr,left,right,value);
}
else{
return mid;
}
}
return -1;
}
//递归方式的时间复杂度:函数每次执行的时间复杂度为O(1),执行递归的次数同非递归的二分查找次数,故时间复杂度也是O(logN);
//空间复杂度:O(1);
int main(){
int arr[]={1,3,5,6,7,8};
int len=sizeof(arr)/sizeof(int);
int m=recur_bin_Search(arr,0,len,8);
printf("%d\n",m);
return 0;
}
斐波那契
#include<stdio.h>
int fibona(int n){ //迭代法
int a=0,b=1,m;
if(n<2){
return n;
}
while(n-->1){
m=a+b;
a=b;
b=m;
}
return m;
}
//时间复杂度为:O(N);空间复杂度为:O(1);
int fibona_recur(int n){ //递归
if(n<2){
return n;
}
else{
return fibona_recur(n-1)+fibona_recur(n-2);
}
}
//时间复杂度:O(2^n) 空间复杂度为:O(1);
int fibona_tail_recur(int n,int a,int b){
if(0==n){
return a;
}
else{
fibona_tail_recur(n-1,b,a+b);
}
}
//时间复杂度为:O(N);空间复杂度为:O(1);
int main(){
int i=0;
for(i;i<12;i++){
int m=fibona_tail_recur(i,0,1);
printf("%d ",m);
}
return 0;
}
相关文章推荐
- 写出斐波那契数列的递归与迭代代码,并分析时间和空间复杂度。
- 以斐波那契数列为例分析递归算法的时间复杂度和空间复杂度
- 排序算法的C语言实现以及各个算法的时间复杂度和空间复杂度分析(冒泡排序)
- 二分查找与斐波那契数递归与非递归的时间复杂度与空间复杂度
- 时间复杂度和空间复杂度的分析
- 算法时间复杂度与空间复杂度分析
- 七种排序方法(稳定性、空间复杂度、时间复杂度)分析总结
- 时间复杂度和空间复杂度的分析
- 分析时间复杂度&空间复杂度,以二分查找和斐波那契数的递归和非递归算法为例
- 数据挖掘算法的空间复杂度与时间复杂度分析
- 时间复杂度和空间复杂度分析
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 分析时间复杂度及空间复杂度
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 算法的时间复杂度和空间复杂度分析
- [LeetCode] Candy (分糖果),时间复杂度O(n),空间复杂度为O(1),且只需遍历一次的实现
- 时间复杂度和空间复杂度
- 内部排序算法的稳定性,时间复杂度和空间复杂度
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。