當前位置:首頁 » 編程語言 » 帶哨兵的查找演算法c語言
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

帶哨兵的查找演算法c語言

發布時間: 2023-05-19 04:58:53

❶ 編程實現順序查找("哨兵"的使用)與折半查找(有序表)演算法.

順序查找

#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就是查找失敗
}