二分查找法(顺序表C\C++)

/**
 * ---Binary search--
 * ----折半查找(二分查找法)----
 * 1.顺序表
 * 2.qsort排序函数
 */
#include <stdio.h>
#include <stdlib.h>
#include "time.h"

//顺序表的数据结构
typedef int SElemType;
typedef struct {
    SElemType *elem;
    int SSTLength;
}SSTable;
/**
 * ---初始化----
 * @return
 */
void SSTInit(SSTable &ST,int len){
    ST.SSTLength=len;
    ST.elem=(SElemType *)malloc(sizeof(SElemType)*ST.SSTLength);//申请堆空间,空间大小为存储的数据类型*长度
    srand(time(NULL));//生成随机数(考研用不着)
    for(int i=0;i<ST.SSTLength;i++){
        ST.elem[i]= rand()%100;//将随机数逐个赋值
    }
}
/**
 * -----二分查找法----
 * @param ST
 * @param element
 * @return
 */
int BinarySearch(SSTable ST,SElemType element){
    int low=0;//头
    int high=ST.SSTLength-1;//尾
    int mid;//中间
    while(low<=high){
        mid=(low+high)/2;//中间的下标取值
        if(element<ST.elem[mid]){
            high=mid-1;//在前半部分,high前移,移到mid前一位,因为mid已比较
        } else if(element>ST.elem[mid]){
            low=mid+1;//在后半部分,low后羿,移动到的位置为mid后面一个
        }else{
            return mid;//要找的值是最后以mid为下标的元素
        }
    }
    return -1;
}
/**
 * ----比较规则----
 * @param left 
 * @param right 
 * @return 
 */
int compare(const void *left,const void *right){//传递一种行为给qsort
    return *(int *)left-*(int *)right;//任意两个数比值,此为从小到大。改变两者位置为从大到小排序
}
/**
 * ----打印----
 */
void SSTPrint(SSTable ST){
    int i;
    for(i=0;i<ST.SSTLength;i++){
        printf("%3.0d",ST.elem[i]); //打印堆空间所存储的元素
    }
}

int main() {
    SSTable ST;
    SSTInit(ST,10);//初始化
    SSTPrint(ST);//打印
    printf("\n");
    qsort(ST.elem,ST.SSTLength,sizeof(SElemType),compare);//排序
    SSTPrint(ST);
    printf("\n");
    SElemType element;
    int position;
    printf("Please insert value for element: \n");
    scanf("%d",&element);
    position=BinarySearch(ST,element);//返回找到的值得位置,未找到返回值为-1
    if(position!=-1){
        printf("Find success for position: %d\n",position);
    }else{
        printf("Find false.I'm so sorry.");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值