数据结构实验8-二分查找与二叉排序树

实验要求

  1. 用随机数产生100个待查找数据元素的关键字值。

  2. 测试下列各排序函数的机器实际执行时间:

    (1)顺序查找
    (2)二叉排序树查找
    (3)折半查找

提示:
(1)和(2)使用同样的实验数据;(3)要求数据元素必须有序,故需要先使用排序算法进行排序(可以使用冒泡排序)

程序代码

#include <bits/stdc++.h>
#define nmax 100
#define maxtime 5000000
#define EQ(a,b) ((a) == (b))
#define LT(a,b) ((a) < (b))
#define LQ(a,b) ((a) <= (b))
#define ElemType int
#define KeyType int
#define TElemType int
#define Status int
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
using namespace std;
int cnt = 0;
typedef struct{
    ElemType *elem;
    int length;
}SSTable;
typedef struct BiTNode{
    TElemType data;
    struct BiTNode * lchild, * rchild;
}BiTNode, *BiTree;
int Search_Seq(SSTable ST, KeyType key)
{
    ST.elem[0] = key;
    int i;
    for(i=ST.length;!EQ(ST.elem[i],key);--i);
    return i;
}
void init(SSTable &st)
{
    st.elem = (int*)malloc(sizeof(int) * (nmax)+1);
    st.length = nmax;
    srand((int)time(NULL));
    for(int i = 1; i<=nmax;++i){
        st.elem[i] = rand()%500;
    }
}
int Search_Bin(SSTable st, KeyType key)
{
    int low = 1, high = st.length;
    while(low<=high){
        int mid = (low + high) /2;
        if(EQ(key,st.elem[mid])) return mid;
        else if(LT(key,st.elem[mid])) high = mid-1;
        else low = mid+1;
    }
    return 0;
}
Status SearchBST(BiTree T,KeyType key, BiTree f, BiTree & p)
{
    if(!T) {p = f; return false;}
    else if(EQ(key,T->data)) { p = T;return true;}
    else if(LT(key,T->data)) return SearchBST(T->lchild,key,T,p);
    else return SearchBST(T->rchild,key,T,p);
}
int Search_Bin_None(SSTable st, KeyType key,int low , int high)
{
    int mid = (low+high)/2;
    if(low>=high) return ERROR;
    if(EQ(key,st.elem[mid])) return mid;
    else if(LT(key,st.elem[mid])) return Search_Bin_None(st,key,low,mid-1);
    else return Search_Bin_None(st,key,mid+1,high);
}
void printtime(double start, double finish,int &cnt )
{
    double duration;
    duration = (double)((finish - start) / CLOCKS_PER_SEC);
    printf("总共耗时%f秒\n",duration);
    printf("其中查找成功%d次\n查找失败%d次\n\n",cnt,maxtime - cnt);
    cnt = 0;
}
Status InsertBST(BiTree & T, ElemType e)
{
    BiTree p;
    if(!SearchBST(T,e,NULL,p)){
        BiTree s = (BiTree) malloc(sizeof(BiTNode));
        s->data = e; s->lchild = s->rchild = NULL;
        if(!p) T = s;
        else if(LT(e,p->data)) p->lchild = s;
        else p->rchild = s;
        return true;
    }
    else return false;
}
void InorderTraverse(BiTree T)
{
    if(T){
        InorderTraverse(T->lchild);
        cnt++;
        printf("%d ",T->data);
        if(cnt %10 ==0)  printf("\n");
        InorderTraverse(T->rchild);
    }
}
void findelem(SSTable st,BiTree T)
{
    init(st);
    double start = 0,finish = 0;
    printf("顺序查找%d次的情况\n",maxtime);
    start = clock();
    int cnt = 0;
    for(int i = 0; i<maxtime;++i){
        if(Search_Seq(st,(i+(rand()%100)/3+1)%750)!=0)
            cnt++;
    }
    finish = clock();
    printtime(start,finish,cnt);

    printf("二分查找(非递归)%d次的情况\n",maxtime);
    sort(st.elem,st.elem+nmax);
    start = clock();
    for(int i = 0; i<maxtime;++i){
        if(Search_Bin(st,(i+(rand()%100)/3+1)%750)){
            cnt++;
        }
    }
    finish = clock();
    printtime(start,finish,cnt);

    printf("二分查找(递归)%d次的情况\n",maxtime);
    start = clock();
    for(int i = 0; i<maxtime;++i){
        if(!Search_Bin_None(st,(i+(rand()%100)/3+1)%750,1,st.length)){
            cnt++;
        }
    }
    finish = clock();
    printtime(start,finish,cnt);

    printf("二叉排序树查找%d次的情况\n",maxtime);
    for(int i = nmax/2;i>=0;--i){
        InsertBST(T,st.elem[nmax/2-i]);
        InsertBST(T,st.elem[nmax/2+i]);
    }
    printf("二叉排序树中序遍历结果为\n",maxtime);
    InorderTraverse(T);
    printf("\n");
    for(int i = 0; i<maxtime;++i){
        if(InsertBST(T,(i+(rand()%100)/3+1)%750)){
            cnt++;
        }
    }
    finish = clock();
    printtime(start,finish,cnt);
}
int main()
{
    SSTable st;
    BiTree T = (BiTree)malloc(sizeof(BiTNode));
    T->lchild = T->rchild = NULL;
    init(st);
    findelem(st,T);
    return 0;
}

运行结果

《数据结构实验8-二分查找与二叉排序树》

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/pengwill97/article/details/79428861
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞