二分查找*递归*与*非递归

二分查找感觉还是挺简单的,我写的这程序是处理有序表的查找,主要思想是这么回事:
已知元素个数,找到位于中间元素的值a[mid],并与要找的value比较,如果大于,那么就从0到mid-1中继续查找。

要考虑的问题,如果元素个数为0,数组中没有要查找的元素,还有找到元素怎么返回。

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
#define MAX 1000
int cos;
void find(int a[],int v,int l,int r)
{
    if(l>r)
    {
       cos=-1;
       return;
    }

    int mid=(l+r)/2;
    if(a[mid]>v)
    find(a,v,l,mid-1);
    else if(a[mid]<v)
    find(a,v,mid+1,r);
    else
    cos=mid;
    return ;
}
void find(int a[],int n,int v)
{
    if(n==0)
    {
        cos=-1;
        return;
    }
    int l=0,r=n-1;
    cos=-1;
    while(l<=r)
    {
        int mid=(l+r)/2;
       if(a[mid]>v)
       r=mid-1;
       else if(a[mid]<v)
       l=mid+1;
       else
       {
           cos=mid;
           break;
       }

    }
    return ;
}
int main()
{
    int a[MAX];
    int n,v;
    printf("输入元素个数:\n");
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    printf("输入查找元素\n");
    scanf("%d",&v);
    //find(a,v,0,n);
    find(a,n,v);
    if(cos==-1)
    printf("没有元素\n");
    else
    {
        printf("元素下表:%d\n",cos);
    }
    system("pause");
}
时间: 2024-10-26 18:49:08

二分查找*递归*与*非递归的相关文章

二分查找算法(非递归)

/** * @param data 带查找的数组(数组) * @param target 目标数据 * @return 返回对应的下标,-1 表示没有找到 */ public static int binarySearch(int[] data, int target) { int low = 0; int high = data.length - 1; // 继续查找 while (high >= low) { int mid = (low + high) / 2; if (data[mid]

二分查找算法(递归与非递归两种方式)

首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下所示. /* * 非递归二分查找算法 * 参数:整型数组,需要比较的数. */ public static int binarySearch(Integer[]srcArray,int des){ //第一个位置. int low=0; //最高位置.数组长度-1,因为下标是从0开始的. int h

二叉树的递归和非递归遍历

// 本次练习的是  二叉树的  递归和非递归  遍历   以及二叉树的  节点数  高度  叶子节点数   和查找功能  //如果要是变量在函数栈回归时不回归原值,则可以用引用// #define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<stack>#include<queue>using namespace std; template<class T>struct BinaryTreeNod

并查集的 路径压缩(递归和非递归)

这里的思路是 在每一次的找父亲节点的时候我们把每一个孩子的父亲的改成他的祖先.因为有可能一个孩子的关系很复杂可能就是一条链,这样查找就没浪费时间. //这是简单的递归实现 find (int x) { while(x!=father[x]) father[x] = find(father[x]) ; return father[x] ; } //这是非递归的 find (int x) { int r = x ; while(r != father[r])//找到r的祖先节点 r = father

全排列算法的递归与非递归实现

全排列算法的递归与非递归实现 全排列算法是常见的算法,用于求一个序列的全排列,本文使用C语言分别用递归与非递归两种方法实现,可以接受元素各不相同的输入序列. 题目来自leetcode: Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the following permutations: [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3

递归转非递归(实例)

递归调用示例算法1.10  求取数组元素的最大值(递归算法)    procedure MAX1(i)    // 查找数组A中最大值元素,并返回该元素的最大下标.//        global integer n,A(1:n),j,k        integer i        if i<n then j←MAX1(i+1)  //递归调用//               if A(i) > A(j) then k←i                   else k←j       

数据结构——二叉树遍历之“递归与非递归遍历”

简述 二叉树的遍历分为先序遍历.中序遍历和后序遍历.如下图所示: 递归遍历 private void bianli1(List<Integer> list, TreeNode root) { // 先序遍历 if (root == null) { return; } list.add(root.val); bianli1(list, root.left); bianli1(list, root.right); } private void bianli2(List<Integer>

JAVA递归、非递归遍历二叉树(转)

原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { private char date; private BinTree lchild; private BinTree rchild; public BinTree(char c) { date = c; } // 先序遍历递归 public static void preOrder(BinTree t) {

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

二叉树遍历递归与非递归实现

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二叉树遍历是二叉树中非常基础的部分,也是学习二叉树必须熟练掌握的部分,下面我们先给出二叉树三种遍历方式的定义,并通过举例来说明二叉树遍历的过程. 二叉树的遍历分为:前序遍历(也叫先序遍历).中序遍历.后序遍历.所谓前.中.后都是根据当前子树根结点相对左右孩子的位置而言,也就是说: 前序遍历:根结点在前,即:根 ----->左------->右: 中序遍历:根结点在中间,即:左------>根------>右: 后序遍历:根结点在最