❶ 编程实现顺序查找("哨兵"的使用)与折半查找(有序表)算法.
顺序查找
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 100typedef int KeyType;
typedef struct {
KeyType *elem;
int length;
}SSTable; /没没/顺序表的存储结构
int Search_Seq(SSTable ST, KeyType key){
int i;
ST.elem[0] = key; //“哨兵”,如果顺序表中不存在要查找的数据的话,则查找指针必丛察誉定指向该哨兵
for(i = ST.length; ST.elem[i] != key; i--)
;
return i; //找到的话,则i != 0,否则i = 0
}
void main()
{
int i, key;
SSTable T;
T.elem = (KeyType *)malloc(sizeof(KeyType));
printf("How Many Entries Do You Want input\n");
scanf("%d"渗段, &T.length);
for(i=1; i<=T.length; i++){
printf("Please input the %dth entries \n", i);
scanf("%d", &T.elem[i]);
}
for (i=1; i<=T.length; i++)
printf("%5d",T.elem[i]); //显示已经输入的所有数据
printf("\nPlease input the data you want to search\n");
scanf("%d", &key);
i = Search_Seq(T,key);
printf("the search data is locate the %dth(0 indicate can not find)\n",i);
}
折半查找
#include <stdio.h>
#include <stdlib.h>
int binSearch(const int *Array,int start,int end,int key)
{
int left,right;
int mid;
left=start;
right=end;
while (left<=right) {
mid=(left+right)/2;
if (key<Array[mid])
{
right=mid-1;
}
else if(key>Array[mid])
{
left=mid+1;
}
else
return mid;
}
return -1;
}
void main()
{
int A[]={10,20,30,40,50,60,70,80};
int n;
printf("Please search num:");
scanf("%d",&n);
int index=binSearch(A,0,8,n);
if(index==-1)
{
printf("no num");
}
else
{
printf("index=%d",index+1);
}
}
❷ 给我个C++实现二分查找的算法
#include <stdio.h>
#include<iostream>
using namespace std;
int main()
{
int a[10]={1,3,6,8,9,11,23,59,60,99};
int x;
int low=0,high=9;
int mid;
cout<<"请输入要查找的数字"<<endl;
cin>>x;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x)break;
if(a[mid]<x)low=mid+1;
else high=mid-1;
}
if(low<=high)cout<<者扮拿"你要找的数字在第"<<首搭mid<<缺缓"位"<<endl;
else cout<<"你要找的数字不存在"<<endl;
return 0;
}
❸ 算法-哨兵查找法(OC、Swift、Python)
我们在一个数组中想查找某个对象item我们改如何操作呢?很简单一层遍历就可以搞定了,如下:
但是我们有没有更优的算法来查找呢?
在数据结构的书中我们可以找到“哨兵查找法”,但是什么又是“哨兵查找法”呢?什么又是“哨兵”呢?
所谓“闭橘哨兵”就是用一个特殊的值来作为数组的边界key,可以少用一条判断语句,目的在于免去查找过程中每一步都要检测整个表是否查找完毕,以达到提高程序的效率。
相对于一层遍历,没有使用”哨兵“的,是有两个判断条件的i<array.count和if(array[i] == item);但是使用了”哨兵“只有一个判断条件if(array[i] == item)!
如果你的数据量非常小的话,相对于一层遍历来说,差别微乎其微,但是当数据达到十万昌敬或者更多的时候,函数的执行时间就会有明显差距了!
我们可耐态慎以将数组的第一个值作为”哨兵“,数据存储下标index从1开始,则list的0号位表示暂无元素,位”哨兵“Key。
比如数组中有一千个元素,我查找中间那个元素,运行结果如下:
欢迎各位大神提出宝贵的意见和建议,也欢迎大家进群交流365152048!
❹ 顺序查找算法
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENGTH 100
typedef int KeyType;
typedef struct {
KeyType *elem;
int length;
}SSTable; //顺序表的存储结构
/*
此算法比第二个算法多了一个判定i是否出界的流程,对于查找数目较少的情况,
二者查找时间相差不大,对于存在大量数据歼培模时,该算法的主要查找时间消耗再判
定是否出界上,中答所以第二个算法明显比第一个算法好,唯一增加的就是一个“氏缓哨兵”
数据。
int Search_Seq(SSTable ST, KeyType key){
int i;
for(i=1; i<=ST.length && ST.elem[i] != key; i++ )
;
if(i<=ST.length)
return i;
else
return 0;
}
*/
int Search_Seq(SSTable ST, KeyType key){
int i;
ST.elem[0] = key; //“哨兵”,如果顺序表中不存在要查找的数据的话,则查找指针必定指向该哨兵
for(i = ST.length; ST.elem[i] != key; i--)
;
return i; //找到的话,则i != 0,否则i = 0
}
void main()
{
int i, key;
SSTable T;
T.elem = (KeyType *)malloc(sizeof(KeyType));
printf("How Many Entries Do You Want input\n");
scanf("%d", &T.length);
for(i=1; i<=T.length; i++){
printf("Please input the %dth entries \n", i);
scanf("%d", &T.elem[i]);
}
for (i=1; i<=T.length; i++)
printf("%5d",T.elem[i]); //显示已经输入的所有数据
printf("\nPlease input the data you want to search\n");
scanf("%d", &key);
i = Search_Seq(T,key);
printf("the search data is locate the %dth(0 indicate can not find)\n",i);
}
❺ C语言数据结构,要求建立哨兵,从后向前查找并输出
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define N 10
typedef struct st{
int data;
int key;
} Note;
Note fun(Note *t,Note ekey) /*查找函数*/
{
int i=N-1;
t[0].key=0; /*哨兵值*/
while(t[i].key!=ekey.key&&i>0)/*查找开始.....*/
{
i--;
}
if(i==0&&t[i].key!=ekey.key)
{
printf("No find.\兄知n");
return t[0];
}
else
return t[i];
}
void main()
{
int i;
Note t[N],ekey,result;
for(i=0;i<N;i++)
{
t[i].key=i;
t[i].data=(i+1)*45;
}
ekey.key=8; /*改这个值,测试*/
ekey.data=9*45;
result=fun(t,ekey);
printf("result.key=%d,result.data=%d\n",result.key,result.data);
}我水平不高,有圆尘缓错误的橘模地方还请朋友指出来,在此谢过了。
❻ 谁能解释下C语言哨兵的原理,为什么加入哨兵后就能判断是否越界最好用代码举例解释!
所谓“哨兵”就是用一个特殊值来作为数组的边界,使用“哨兵”可以少用一条判断语句,所以可蚂誉顷以提高程序的效率。
比如从整数数组arr中,查找有没有整数num。
应用:假设一个乱序数组,需要查找一个元素是虚差否在该数组中,这时需要用到顺序查找,也就是遍历数组。
一般情况下我们会闷陆写下如下代码:
int Sequential_Search(int *a,int n,int key)
{
//数组从1开始
int i;
for(int i=1;i<=n;i++)
{
if(a[i]==key)
return i;
}
return 0;//查找失败
}
有的数据结构书上,会运用哨兵元素,改成这样的代码:
int Sequential_Search2(int *a int n,int key)
{
int i=0;
a[0]=key;//哨兵
i=n;
while(a[i]!=key)
{
i--;
}
return i;//返回0就是查找失败
}