/**
* ---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;
}
二分查找法(顺序表C\C++)
最新推荐文章于 2023-12-03 19:04:44 发布