【基础算法】顺序查找 折半查找 & 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

目录
相关文章
|
16天前
|
机器学习/深度学习 安全 算法
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
【图论】【割点】【C++算法】928. 尽量减少恶意软件的传播 II
|
1月前
|
存储 算法 数据管理
【C/C++ 基础算法】 C/C++ 位图算法的使用
【C/C++ 基础算法】 C/C++ 位图算法的使用
35 0
|
1月前
|
自然语言处理 算法 C++
在C++语言中非修正算法
在C++语言中非修正算法
13 1
|
2月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
2月前
|
机器学习/深度学习 算法 测试技术
【动态规划】【C++算法】2742. 给墙壁刷油漆
【动态规划】【C++算法】2742. 给墙壁刷油漆
|
2月前
|
算法 测试技术 C++
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
【动态规划】【状态压缩】【C++算法】1815 得到新鲜甜甜圈的最多组数
|
1月前
|
机器学习/深度学习 算法 程序员
C++ Algorithm 库 算法秘境探索(Algorithm Wonderland Exploration)
C++ Algorithm 库 算法秘境探索(Algorithm Wonderland Exploration)
75 1
|
1月前
|
缓存 算法 C语言
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
【C++ 标准查找算法 】C++标准库查找算法深入解析(In-depth Analysis of C++ Standard Library Search Algorithms)
46 0
|
16天前
|
算法 测试技术 C#
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
|
16天前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素