二分查找算法,斐波那契数列的递归及非递归。(分析时间复杂度及空间复杂度)

来源:互联网 发布:python post本地文件 编辑:程序博客网 时间:2024/05/18 22:42

二分查找的非递归与递归实现:

#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;returnrecur_bin_Search(arr,left,right,value);}else if(value>arr[mid]){left=mid+1;returnrecur_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;}



阅读全文
0 0
原创粉丝点击