欢迎阅读罡罡同学的文章(关注不迷路)
(记得点赞关注哈)
还在为代码无法正常运行而烦恼,关注罡罡同学不迷路,解决你的烦恼。如果你觉得,本文章对你有那么一丢丢的帮助,记得点赞关注转发,罡罡同学非常感谢哈!
后续文章是关于数据结构一些基础实验,本人都已经成功运行,如果有问题,欢迎在评论区留言。我是罡罡同学,一位初入网安的小白。☜(ˆ▽ˆ)
您的支持是罡罡同学前进的最大动力!
二分查找
用二分查找之前必须保证待查找序列为有序序列。可以采用冒泡排序将无序序列调整为有序序列。
源代码会在下面展示,讲解视频在B站上哦(需要的同学动动手指转移到B站)链接如下: https://www.bilibili.com/video/BV1FD4y1D73o 或B站关注 罡罡同学 找7-6号动态
本程序共用两种:1.非递归的2.递归+查找轨迹+冒泡排序的优化
第一种源代码:
typedef struct
{ int* data;//动态数组变量
int length;
}SSTable;
int SSTable_init(SSTable *ST)
{ int k,length;
printf("输入表的长度:");
scanf("%d",&length);
ST->length=length;
ST->data=(int*)malloc((length)*sizeof(int));
printf("输入%d个表的元素:",ST->length);
for(k=0;k<ST->length;k++)
scanf("%d",&ST->data[k]);
return ST->data!=NULL;//分配内存成功返回1,否则返回0
}
void SSTable_bubble(SSTable *ST)//冒泡排序为递增顺序
{ int i,j,t;
for(i=1;i<ST->length;i++)
for(j=0;j< ST->length -i;j++)
if(ST->data[j]>ST->data[j+1])
{ t=ST->data[j];
ST->data[j]=ST->data[j+1];
ST->data[j+1]=t;
}
printf("冒泡排序为增序列:");
for(i=0;i<ST->length;i++)
printf("%d ",ST->data[i]);
printf("\n");
}
int Search_Bin(SSTable *ST)// 二分查找 (大前提:顺序存储且有序)
{ int low=0,high=ST->length-1,key,mid;//初始化低位、高位指针
printf("输入查找元素:",key);//key为查找元素
scanf("%d",&key);
while(low<=high)
{ mid=(low+high)/2;
if(key==ST->data[mid])
{ printf("元素所在位置: %d",mid+1);
return mid+1;//注意: mid=0代表位置为0,而非找不到
}
else if(key<ST->data[mid])
high=mid-1;//继续在前半区间进行查找
else low=mid+1;//继续在后半区间进行查找
}
}
int main()//5 13 19 21 37 56 64 75 80 88 90 查找21 乱序的 19 5 75 80 90 56 64 21 13 37 88
{ SSTable ST;
SSTable_init(&ST);
SSTable_bubble(&ST);
Search_Bin(&ST);
return 0;
}
第二种源代码:
void shuzu_init(int a[],int n)
{ int i;
printf("输入%d个数组元素:",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}
void shuzu_print(int a[],int n)
{ int i;
printf("打印数组:");
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
void bubble_new_three(int a[],int n)//优化冒泡排序——双向冒泡排序(鸡尾酒排序 )
{ int i,j,temp;// 用来判断内层循环是否交换,若为交换,说明已经有序,不再比较
int flag=0;
for(i=0;i<n/2;i++)
{ for(j=0;j<n-1;j++)//奇数轮从左向右比较交换
{ if(a[j]>a[j+1])
{ temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1;
}
}
if(flag==0) break;//一趟排序中没有发生交换
else flag=0;//重置flag,进行下次判断
for(j=n-2;j>=1;j--)//偶数轮,从右向左比较交换
{ if(a[j]<a[j-1])
{ temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
flag=1;
}
}
if(flag==0) break;
else flag=0;
}
}
int Search_Bin_digui(int a[],int low,int high,int key)//二分查找递归+查找路径 (大前提:顺序存储且有序)
{ int mid;
if(low>high)
{ printf("查找失败");
return -1;
}
else
{ mid=(low+high)/2;
if(key<a[mid])
{ printf("%d->",a[mid]);
return Search_Bin_digui(a,low,mid-1,key);
}
else if(key>a[mid])
{ printf("%d->",a[mid]);
return Search_Bin_digui(a,mid+1,high,key);
}
else
{ printf("%d 查找元素位置为:%d",a[mid],mid);
return mid;
}
}
}
int main()//1 2 5 7 4 3 6 8 9 10 //5 13 19 21 37 56 64 75 80 88 90
{ int a[20],n,key;
printf("数组元素个数:");//三种优化的冒泡排序,鸡尾酒冒泡排序最高效,
scanf("%d",&n); // 三种优化冒泡排序效率依次增加
shuzu_init(a,n);
bubble_new_three(a,n);//双向冒泡排序(鸡尾酒排序 )
shuzu_print(a,n);
printf("输入待查找元素:");
scanf("%d",&key);
Search_Bin_digui(a,0,n-1,key);
return 0;
}
我是罡罡同学,一位初入网安的小白。☜(ˆ▽ˆ)
(疯狂暗示 点赞 !关注!转发 !!! 点赞 !关注!转发 !!!)