【基础算法】顺序查找 折半查找 & C++实现

简介: 顺序查找比较简单,就是顺序遍历我们所要查找的内容,判断并找出相应的目标数。比较简单,在这里不用图形说明程序实现具体情况。当面临大量数据时,顺序查找的效率非常低,时间复杂度大,所以会采用其他方法进行查找。

●顺序查找


       顺序查找比较简单,就是顺序遍历我们所要查找的内容,判断并找出相应的目标数。比较简单,在这里不用图形说明程序实现具体情况。当面临大量数据时,顺序查找的效率非常低,时间复杂度大,所以会采用其他方法进行查找。


#include<iostream>
using namespace std;
#define size 20
class shunxu {
public:
  void searchfun()
  {
  for (int i = 0; i < size; i++)
  {
    if (arr[i] == n)
    place = i;
  }
  }
  int arr[size];
  int n;
  int place;
};
void text()
{
  shunxu sx;
  cout << "输入顺序查找的内容:";
  for (int i = 0; i < size; i++)
  {
  cin >> sx.arr[i];
  }
  cout << "输入要查找的目标:";
  cin >> sx.n;
  sx.searchfun();
  cout << "所查找目标的位置:" << sx.place << endl;
}
int main()
{
  text();
}

ea2d2d0983a8aeeba5b8f8221de6e4ff_f14b31e4bec94dc5acd647859c1faa13.png


●折半查找


       在下面我们从十个数中查找目标数,用折半查找法进行查找(在这里不进行排序,只进行折半查找),如下图所示。


第一次,low=0、high=9  =>  mid=4,进行判断arr[mid]<n,则定位到后半段,low=mid+1;


第二次,low=5、high=9  =>  mid=7,进行判断arr[mid]>n,则定位到前半段,high=mid-1;


第三次,low=5、high=6  =>  mid=5,进行判断arr[mid]<n,则定位到后半段,low=mid+1;


第四次,low=6、high=6  =>  mid=6,进行判断arr[mid]=n,找到目标值的位置,place=6;

cba52f1f0ab26f62b159d9e270a0157c_8bed52c9312440d2a713d80d7b7c94f7.png

       当面临大量数据时,我们先将这些数据进行排序,再用折半查找法进行查找。这样可以极大的提高查找效率,降低时间复杂度从而快速的寻找到目标数。

#include<iostream>
using namespace std;
#define size 20
class halfsearch {
public:
  void bullesort_1();  //对随机生成的数进行排序,随机找一种排序算法即可,这里用冒泡这种简单排序法
  int halfsearch_1()  //折半查找
  {
  int low=0, mid, high=size-1;
  while (low<=high)
  {
    mid = (low + high) / 2;     //折半
    if (arr[mid] == n)
    return place = mid;
    else if (arr[mid] > n)    //目标数在前一半里
    high = mid - 1;
    else                      //目标数在后一半里
    low = mid + 1;
  }
  return place = 0;
  }
  void showplace()
  {
  if (place == 0)
    cout << "没有找到" << endl;
  else
    cout << "找到目标数且位置为:" << place+1 << endl;
  }
  int arr[size];
  int n;
  int place;
};
void halfsearch::bullesort_1()  //冒泡排序法
{
  int temp;
  for (int i = 0; i < size-1; i++)
  {
    for(int j=size-1;j>i;j--)
    { 
    if (this->arr[j ] < this->arr[i])
    {
      temp = this->arr[j ];
      this->arr[j ] = this->arr[i];
      this->arr[i] = temp;
    }
    }
  }
}
void text()
{
  halfsearch hs;
  srand(time(NULL)); 
  for(int i=0;i<size;i++)
  { 
  hs.arr[i] = rand() / 1000 + 100;   //生成100~200的随机数
  }
  hs.bullesort_1(); //先进行排序,后进行折半查找
  cout << "随机生成的数排序后如下:" << endl;
  for (int j = 0; j < size; j++)
  {
  cout << hs.arr[j] << " ";     
  }        
  cout<<endl;
  cout << "输入要查找的数:";
  cin >> hs.n;   //输入要查找的目标数
  hs.halfsearch_1();   //进行折半查找
  hs.showplace();  //输出查找到的位置
}
int main()
{
  text();
}

d2c772d4d1c4a6b0d94edabb840daa99_ac59566ff3a04183ab80aad03f9275c0.png

目录
相关文章
|
2月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
2月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
649 0
高精度算法(加、减、乘、除,使用c++实现)
|
2月前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
31 0
|
2月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
2月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
2月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
2月前
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)
|
2月前
|
人工智能 算法 C++
一篇带你速通前缀和算法(C/C++)
一篇带你速通前缀和算法(C/C++)
|
2月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
2月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)