数据结构考研复习(顺序查找&折半查找)
这部分内容和复习资料上写的不太一样,比如【哨兵】的存放位置,以及结果的呈现方式等。
需要注意的是折半查找要求数据有序顺序存储,所以要注意数据的输入。
顺序查找部分有个小bug,我暂时还没反应过来,具体表现为不能查找最后一个数据。
代码如下:
#include <stdio.h> #define InitSize 100 typedef struct{//查找表的数据结构 int *elem;//元素存储空间基址,建表时按照实际长度分配。0号单元留空 int TableLen;//表的长度 }SSTable; /* -1- 顺序查找*/ bool Search_Seq(SSTable ST,int key){ ST.elem[ST.TableLen] = key;//将哨兵位置放到末尾 ST.TableLen++; int i,j=1; i=(ST.TableLen-2);//将i赋值为末尾元素下表 while(ST.elem[i]!= key){ i--; j++; } printf("【顺序查找】当前查找次数为:%d次",j+1);//最后一次会跳出循环所以加一 return true; } /* -2- 折半查找*/ int Binary_Search(SSTable ST,int key){ int low = 0,high = ST.TableLen-1,mid,i=1; while(low <= high){ mid = (low + high)/2;//取中间位置 printf("---------------\n"); printf("low:%d, ",low); printf("mid:%d, ",mid); printf("high:%d ",high); printf("\n---------------\n"); if(ST.elem[mid] == key) { return i;//查找成功则返回所在位置 } else if(ST.elem[mid]>key) { high = mid - 1; i++; //从前半部分继续查找 } else { low = mid + 1; i++; //从后半部分继续查找 } } return i; } bool Init_Tab(SSTable &ST){ ST.elem = new int[InitSize]; ST.TableLen = 0; return true; } bool Insert_Tab(SSTable &ST, int e){ int i = ST.TableLen; ST.elem[i+1] = e; ST.TableLen ++; return true; } bool Get_Tab(SSTable ST, int i,int &e){ e = ST.elem[i]; return true; } int main(){ SSTable ST; if(Init_Tab(ST)){ printf("创建成功!\n"); } int len,e_1; printf("请输入数据长度:\n"); scanf("%d",&len); printf("依次输入%d个值:\n",len); for(int i = 1;i <= len;i++) { scanf("%d",&e_1); Insert_Tab(ST,e_1); } printf("\n"); for(int j = 1;j <= len;j++){ int e_2; Get_Tab(ST,j,e_2); printf("%d ",e_2); } printf("\n"); int key,k; printf("请输入要查找的元素:\n"); scanf("%d",&key); printf("数据长度为:%d\n",len); printf("【折半查找】当前查找次数为:%d次",Binary_Search(ST,key)); printf("\n"); Search_Seq(ST,key); }
运行结果: