二分查找【循环和递归】

简介: 对一个数组a,在区间下标[x,y]寻找p是否存在,存在则返回下标,否则返回-1。 循环和递归实现:(练习用的程序) 1 #include 2 #include 3 #include 4 5 int binSerrch(int a[],int x,int y,int p...

对一个数组a,在区间下标[x,y]寻找p是否存在,存在则返回下标,否则返回-1。

循环和递归实现:(练习用的程序)

 1 #include <stdio.h>
 2 #include<stdlib.h>
 3 #include<time.h>
 4 
 5 int binSerrch(int a[],int x,int y,int p);//在非递减数组a的x到y区间寻找p,假如存在则返回p的下标,否则返回-1
 6 int binSerrch2(int a[],int x,int y,int p);//递归实现 
 7 int cmp(const void *a,const void *b)
 8 {
 9     int x,y;
10     x=*(int *)a;
11     y=*(int *)b;
12     return x-y;
13 }
14 int main(int argc, char *argv[])
15 {
16     int a[20];
17     int i;
18     int p,ans1,ans2;
19     
20     srand((unsigned)time(0));
21     
22     for(i=0;i<20;i++)
23         a[i]=rand()%50+1;
24     
25     qsort(a,20,sizeof(a[0]),cmp);
26     
27     for(i=0;i<20;i++)
28     {
29         printf("%d ",a[i]);
30         if((i+1)%10==0) printf("\n");
31     }
32     printf("\n");
33     
34     for(i=1;i<=10;i++)
35     {
36         p=rand()%50+1;
37         ans1=binSerrch(a,0,19,p);
38         ans2=binSerrch2(a,0,19,p);
39         printf("%d %d %d\n",p,ans1,ans2);
40     }
41     
42     return 0;
43 }
44 int binSerrch(int a[],int x,int y,int p)//在数组a的x到y区间寻找p,假如存在则返回p的下标,否则返回-1
45 {
46     int mid;
47     while(x<=y)
48     {
49         mid=(x+y)/2;
50         if(a[mid]==p)
51             return mid;
52         else if(a[mid]>p)
53             y=mid-1;
54         else
55             x=mid+1;
56     }
57     return -1;
58 }
59 int binSerrch2(int a[],int x,int y,int p)//递归实现 
60 {
61     int mid;
62     if(x>y) return -1;
63     else 
64     {
65         mid=(x+y)/2;
66         if(a[mid]==p) return mid;
67         else if(a[mid]>p) return binSerrch2(a,x,mid-1,p);
68         else return binSerrch2(a,mid+1,y,p);
69     }
70 }
View Code

 

相关文章
|
数据安全/隐私保护 C语言
二分查找以及循环练习
二分查找以及循环练习
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
241 0
|
人工智能 JavaScript C++
循环 vs 递归
注:本文代码使用 JavaScript。 一些同学对递归的理解还停留在“是一种求阶乘比循环低效的方法”。但其实递归和循环处理的问题是不同。拿“遍历数组”这个问题来说:循环适合同一维度(单层长度不限)上的遍历,而递归则适合跨维度(层数不限)的遍历。 比如遍历以下一维数组: var a1 = [1]; var a2 = [1, 2]; var a3 = [1, 2, 3]; 虽然它们长度不一,但循
1430 0
|
算法
二分查找(递归与非递归)
来源:http://blog.csdn.net/q3498233/article/details/4419285 递归方法 1 int BinSearch(int Array[],int low,int high,int key/*???*/) 2 { 3 if ...
818 0
一般递归&尾递归&循环递归
一、先举2个栗子: (1)阶乘(2)斐波那契数列递归
136 0
|
人工智能 搜索推荐
查找第k小的元素(O(n)递归解法)
今天分享一个小技巧,虽然是小技巧但是还是很有价值的,曾经是微软的面试题。题目是这样的,一个无序的数组让你找出第k小的元素,我当时看到这道题的时候也像很多人一样都是按普通的思维,先排序在去第K个,但是当数组非常大的时候,效率不高,那有没有简单的方法了,其实我们早就学过,只是我们不善于思考和变通。
1223 0
|
10月前
C++-你知道二叉搜索树吗?(循环版)
C++-你知道二叉搜索树吗?(循环版)
47 0
|
算法
一步一步写算法(之循环和递归)
原文: 一步一步写算法(之循环和递归) 【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容。
895 0

热门文章

最新文章