折半查找c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define ElementType int
typedef struct {
    ElementType *elem;
    int tableLen;
}SSTable;


void initaSSTable(SSTable &table){
    table.elem=(ElementType*)malloc(20*sizeof(ElementType));
    table.tableLen=0;
    srand(time(0));
    for (int i = 0; i < 15; ++i) {
        //生成范围在5,24之间的随机数
        int num = rand() % 20 + 5;
        table.elem[i]=num;
        table.tableLen++;
        printf("%d  ",table.elem[i]);
    }
}

void BubbleSort(SSTable &table){
    ElementType temp=0;
    for (int i = 0; i < table.tableLen; ++i) {
        for (int j = i+1; j < table.tableLen; ++j) {
            if(table.elem[i]<table.elem[j]){
                temp=table.elem[i];
                table.elem[i]=table.elem[j];
                table.elem[j]=temp;
            }
        }
    }
    printf("\nafter bubble sort \n");
    for (int i = 0; i < table.tableLen; ++i) {
        printf("%d  ",table.elem[i]);
    }
}

bool BiSearch(SSTable table,ElementType num,int &pos){
    int high=table.tableLen-1;
    int low=0;
    int mid;

    while (high>=low){
        mid=(high+low)/2;
        if (table.elem[mid]==num){
            pos=mid+1;
            return true;
        }
        else if(table.elem[mid]<num){
            high=mid-1;
        }
        else{
            low=mid+1;
        }
    }
    pos=-1;
    return false;
}

//函数名存储的是函数的入口地址,也是一个指针,为函数指针类型
//left指针和right指针指向数组中的任两个元素
//qsort规定left指针指向值大于right指针指向的值,返回正值为从小到大排序
int compare(const void *left,const void *right){
    //从大到小排序
    return *(ElementType*)right-*(ElementType*)left;
}


int main() {
    SSTable table;
    initaSSTable(table);
    //BubbleSort(table);
    int pos=0;
    printf("\n");
    //stdlib自带的qsort
    qsort(table.elem,table.tableLen,sizeof(ElementType),compare);
    for (int i = 0; i < table.tableLen; ++i) {
        printf("%d  ",table.elem[i]);
    }
    BiSearch(table,10,pos);
    if(pos>0){
        printf("\nthe num is at %d pos",pos);
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值