八戒m-y 2023-10-10 09:45 采纳率: 52.6%
浏览 7

二分法查找的排序出现错误

二分法查找 在对生成数进行排序时,出现数据的漏掉 最小的数无法排进去

img


```c++
#include <iostream>
#include <stdlib.h>
#include <time.h>
//二分查找(折半查找)
typedef int ElemType;
typedef struct {
    ElemType* elem;
    int TableLen;
}SSTable;

void ST_Init(SSTable &ST,int len){
    ST.TableLen=len+1;//多申请一个位置,为了存哨兵,不使用哨兵也可以,为了和王道书上保持一致
    ST.elem= (ElemType*)malloc(sizeof (ElemType)*ST.TableLen);
    int i;
    srand(time(NULL));//随机数生成
    for(i=1;i<ST.TableLen;i++){
        ST.elem[i]=rand()%100;//为了生成的随机数都在0到99之间

    }
}
void ST_print(SSTable ST){
  int i;
  for(i=1;i<ST.TableLen;i++){
      printf("%3d",ST.elem[i]);
  }
    printf("\n");
}
int Search_Seq(SSTable ST,ElemType key){
    ST.elem[0]=key;//key作为0号元素 用于存放哨兵
    int i;
    for(i=ST.TableLen-1;ST.elem[i]!=key;i--);//从后往前找,找到了,i就是当前位置
    return i;
    printf("\n");

}
//二分查找
int BinarySearch(SSTable L,ElemType key){
    int low=0;
    int high=L.TableLen-1;
    while(low<=high){
        int mid=(low+high)/2;
        if (key>L.elem[mid])//如果目标值大于中位数
             {
              low=mid+1;

             } else if (key<L.elem[mid]){
             high=mid-1;
        } else{
            return mid;
        }
    }
    return -1;
}
//left指针和right指针指向的数组中的任意两个元素
int compare(const void *left,const void *right){
    return *(int*)left-*(int*)right;//从小到大排序
    //*(int*)right-*(int*)left 从大到小排序
}
int main() {
    SSTable ST;
    ST_Init(ST,10);//初始化随机10个数
    ST_print(ST);
    qsort(ST.elem,ST.TableLen,sizeof (ElemType),compare);
    ST_print(ST);
    ElemType key;
    printf("please input search key:\n");
    scanf("%d",&key);
    int pos= BinarySearch(ST,key);
    if (pos!=1){
        printf("find key %d\n",pos);
    } else{
        printf("not find\n");
    }

//    int pos= Search_Seq(ST,key);
//    if (pos)
//    {
//        printf("查找成功 位置为%d\n",pos);
//    } else{
//        printf("查找失败\n");
//    }
    return 0;
}



  • 写回答

2条回答 默认 最新

  • id942yashua 2023-10-10 10:51
    关注

    申请的时候多申请了一个位置,ST.elem[0]位置上的数据不确定,排序的时候反而将11个元素都进行了排序,所以出现了以上的问题。
    试着把
    qsort(ST.elem,ST.TableLen,sizeof (ElemType),compare);
    修改成
    qsort(ST.elem+1,ST.TableLen-1,sizeof (ElemType),compare);
    看看问题是否能够解决

    评论

报告相同问题?

问题事件

  • 创建了问题 10月10日

悬赏问题

  • ¥20 visual studio中c语言用ODBC链接SQL SERVER
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询