查找: 1、顺序查找(顺序表、链表) 2、折半查找(折半查找、判定树)

/**
 * 查找:
 * 1、顺序查找(顺序表、链表)
 * 2、折半查找(折半查找、判定树)
 *
 * ①算法思想
 *
 * ②算法设计
 *
 */

#include <stdio.h>
#include <iostream>
#include <cstdio>
#include <malloc.h>
#include <cstdlib>
#define MaxSize 20
#define INF 999999

//查找
//1、顺序查找
//①顺序查找---顺序表
typedef struct{
    int data[MaxSize];
    int length;
}SqList;
int Seq_Search(SqList L,int x){
    int i = 0;
    while(x != L.data[i] && i <= L.length - 1){
        i++;
    }
    if(i >= L.length)
        return -1;
    else
        return i;
//    或者:
//    if(x == L.data[i])
//        return i;
//    else
//        return -1;
}
//②顺序查找---链表
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;
LinkList Seq_Search(LinkList L,int key){
    LinkList p = L;
    while(p){
        if(p -> data == key)
            break;
        p = p -> next;
    }
    if(p -> data == key)
        return p;
    else
        return NULL;
}

//2、折半查找(只适用于顺序表)(补充:利用二分查找判定树构造一棵高度平衡的最优二叉搜索树)
//①折半查找
typedef struct{
    int data[MaxSize];
    int length;
}SqList;
int Binary_Search(SqList L,int x){
    int low = 0,high = L.length - 1,mid;
    while(low <= high){
        mid = (low + high) / 2;
        if(L.data[mid] == x)
            break;
        else if(L.data[mid] > x)
            high = mid - 1;
        else
            low = mid + 1;
    }//二分查找结束
    //如果是查找成功的情况
    if(low <= high)
        return mid;
    //如果是查找失败的情况
    else
        return -1;
}
//②利用二分查找判定树构造一棵高度平衡的最优二叉搜索树
//补充:折半查找判定树就是一棵最优的二叉搜索树(自然也是平衡二叉树),
//将有序数组转换为二叉搜索树,但是这个二叉搜索树要求树高平衡,也就是一棵平衡二叉树:
//(利用二分查找判定树构造一棵高度平衡的最优二叉搜索树!!!)
BiTree build(int *nums,int low,int high){
    if(low <= high){
        int mid = (low + high) / 2;
        BiTree T = (BiTree)malloc(sizeof(BiTreeNode));
        T -> data = nums[mid];
        T -> lchild = build(nums,low,mid - 1);
        T -> rchild = build(nums,mid + 1,high);
        return T;
    }else{
        return NULL;
    }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值