#include <string>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
//循序表数据结构
typedef int Elemetype;
typedef struct SquanList{
Elemetype *data;
int length;
}SquanList;
//建立循序表
void EnElement(SquanList &L){
printf("Please input the length of List:");
int Length; //定义循序表长度
scanf("%d",&Length);
L.length=Length;
L.data=(Elemetype*) malloc(sizeof (Elemetype)*L.length);
srand(time(NULL));
for (int i =0;i<L.length; ++i) {
L.data[i]=rand()%100;
}
}
/*定义compare函数,由于二分查找只适用于已排序好的循序表,所以查找前必须进行排序。
* 而这里我们用到qsort函数进行排序,所以需要先定义compare函数规定排序方式。*/
int Compare(void const *Right,void const *Left){
return *(Elemetype*)Right- *(Elemetype*)Left; //从小到大排序
}
//排序函数
void Sorting(SquanList L){
qsort(L.data,L.length,sizeof (Elemetype),Compare);//qsort实现的是快排
}
//二分查找函数
int BenarSearch(SquanList L){
int Target;
printf("Please input the target Element:");
scanf("%d",&Target);
int Lost=0,High=L.length-1,Middle; //二分查找用到目标数据的最大值,最小值,中间值的下标
Middle=(Lost+High)/2;
while (High>=Lost){
if (Target>L.data[Middle]){
Lost=Middle+1;
Middle=(Lost+High)/2;
} else if (Target<L.data[Middle]){
High=Middle-1;
Middle=(Lost+High)/2;
} else{
printf("The post of target Element :%d\n",Middle+1);
return Middle;
}
}
printf("Target Element dose not exit!\n");
return -1;
}
//遍历顺序表
void PrintList(SquanList L){
for (int i = 0; i < L.length; ++i) {
printf("%3d",L.data[i]);
}
printf("\n");
}
int main() {
SquanList L;
EnElement(L);
Sorting(L);
PrintList(L);
BenarSearch(L);
return 0;
}
C/C++循序表的二分查找
于 2024-04-17 14:51:35 首次发布