欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

查找算法之顺序查找和二分查找

程序员文章站 2024-03-17 17:05:40
...

1.顺序查找

基本思想:从数据结构线性表一端开始,顺序扫描,依次将扫描到的关键字值与给定key相比较,若相等则表示查找成功 ;若扫描结束仍没有找到关键字等于key值的结点,表示查找失败。
顺序查找适合于存储结构为顺序存储或链接存储的线性表。

代码如下:

#include<cstdio>
#include<iostream>
using namespace std;

const int maxn = 110;  
int arr[maxn];

int SequenceSearch(int arr[],int key, int n);

int main(){
 int n,key;
 printf("请输入元素的个数:\n"); 
 scanf("%d",&n);
 
 printf("请输入数组中的元素:\n");
 for(int i=0; i<n; i++){
  scanf("%d", &arr[i]);
 }
 
 printf("请输入要查找的值: ");
 scanf("%d", &key);
 
 int k = SequenceSearch(arr, key, n);
 
 if(k != -1)  printf("该值在数组下标为%d的位置", k);
 else    printf("该值不存在!"); 
    
 return 0;
}

int SequenceSearch(int arr[],int key, int n){
 int flag = 0;
for(int i=0; i<n; i++){
  if(arr[i] == key){
   flag =1;
   return i;
  }
 }
 
if(flag == 0) 
  return -1;
}

编译运行结果如图所示:

查找算法之顺序查找和二分查找

2.二分查找

基本思想:二分查找也称折半查找,中间结点将整个有序表分成两个子表,先将中间结点的关键字与给定的key值进行比较,若相等则查找成功;若不相等,则比较key值与中间结点关键字的大小,若key值小于中间结点关键字值,就继续在左边的字表进行二分查找,反之,在右边的字表进行二分查找。递归进行,直到查找到或查找结束发现表中没有这样的结点。

二分查找的表必须是有序的,如果是无序的需要进行排序;二分查找是一棵二叉排序树,每个根节点的值都大于左子树的所有结点的值,小于右字数所有结点的值。

代码如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 110;  
int arr[maxn];

int BinarySearch(int arr[],int key, int n);

int main(){
int n,key; //元素个数,查找的值

printf("请输入元素的个数:\n"); 
scanf("%d",&n);

printf("请输入数组中的元素:\n");
 for(int i=0; i<n; i++){
  scanf("%d", &arr[i]);
 }
 
printf("请输入要查找的值: ");
scanf("%d", &key);

sort(arr, arr+n);  //排序函数 
int k = BinarySearch(arr, key, n);
if(k != -1)  printf("该值存在!");
    else    printf("该值不存在!"); 
    
    return 0;
 
}

int BinarySearch(int arr[], int key, int n){
 int low = 0, high = n-1;
 while(low <= high){
  
 int mid = (low +high)/2; //找出序列的中间点
 
 if(arr[mid] == key)  return mid;
 else if(arr[mid]> key) high = mid -1;
 else low = mid+1; 
 
 }
 return -1;
 
}

编译运行的结果如图所示:
查找算法之顺序查找和二分查找

参考文章

相关标签: 算法