C++分治策略实现二分搜索

由于可能需要对分治策略实现二分搜索的算法效率进行评估,故使用大量的随机数对算法进行实验(生成随机数的方法见前篇随笔)。

由于二分搜索需要数据为有序的,故在进行搜索前利用函数库中sort函数对输入的数据进行排序。

代码主要用到的是经典的二分查找加上递归。

其中limit为所要从随机数文件中提取的数据的数量,以此为限来决定算法需要在多少个数据中进行搜索。

为了使代码更人性化,加入了查找成功与失败的提醒,主要区别于Search函数中的返回值,若查找成功则返回1(满足1>0,即为查找成功),其余则返回0,即为查找失败。

通过clock函数对算法运行的时间进行计算以评估算法效率。

 1 #include <iostream>2 #include <fstream>
 3 #include <cstdlib>
 4 #include <ctime>
 5 #include <algorithm>
 6 using namespace std;
 7 #define limit 100000
 8
 9 int Search(int R[],int low,int high,int k)    //low表示当前查找的范围下界、high表示当前查找范围的上界,k为所要查找的内容
10 {
11     int mid;
12
13     if (low<=high){                           //查找区间存在一个及以上元素
14         mid=(low+high)/2;                     //求中间位置
15         if (R[mid]==k)                        //查找成功返回1
16             return 1;
17         if (R[mid]>k)                         //在R[low..mid-1]中递归查找
18             Search(R,low,mid-1,k);
19         else                                  //在R[mid+1..high]中递归查找
20             Search(R,mid+1,high,k);
21     }
22     else
23         return 0;
24 }
25
26 int main(void)
27 {
28     ifstream fin;
29     int x;
30     int i;
31     int a[limit];
32     int result;
33
34     fin.open("random_number.txt");
35     if(!fin){
36         cerr<<"Can not open file ‘random_number.txt‘ "<<endl;
37         return -1;
38     }
39
40     time_t first, last;
41
42     for(i=0; i<limit; i++){
43         fin>>a[i];
44     }
45     fin.close();
46
47     sort(a,a+limit);
48
49     cout<<"Please enter the number you want to find:";
50     cin>>x;
51
52     first = clock();
53
54     result = Search(a,0,limit-1,x);
55
56     if(result>0)
57         cout<<"Search success!"<<endl;
58     else
59         cout<<"Can not find it!"<<endl;
60
61     last = clock();
62
63     cout<<"Time cost: "<<last-first<<endl;
64
65     return 0;
66 }

原文地址:https://www.cnblogs.com/Weiss-Swire/p/11615842.html

时间: 2024-10-15 00:33:30

C++分治策略实现二分搜索的相关文章

2_3 递归与分治策略(二分搜索技术)

二分搜索算法是分支策略的典型应用,具体是在给定的有n个元素的已排序序列a中找出一个特定元素. 基本思想:将n个元素分为两半,取a[n/2]与x进行比较, 如果x<a[n/2],继续在数组a的左半部分搜索. 如果x>a[n/2],继续在数组a的右半部分搜索. (图片源自百度图片) 查找算法对比: 1.顺序搜索不能很好利用排序这个已知条件,而且是O(n)算法. 2.二分搜索充分利用排序条件,算法复杂度是O(log n). 上代码: public class a_2_3<T extends C

计算机算法设计与分析之递归与分治策略——二分搜索技术

递归与分治策略 二分搜索技术 我们所熟知的二分搜索算法是运用分治策略的典型例子,针对这个算法,先给出一个简单的案例. 目的:给定已排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定的元素x. 我们首先想到的最简单的是用顺序搜索方法,逐个比较a[0:n-1]中元素,直至找出元素x或搜索遍整个数组后确定x不在其中.这个方法没有很好地利用n个元素已排好序的这个条件,因此在最坏的情况下,顺序搜索方法需要O(n)次比较. 而二分搜索方法充分利用了元素间的次序关系,采用分治策略,可在最坏情况下用

【经典算法】分治策略

一.什么是分治 有很多算法是递归的:为了解决一个给定的问题,算法要一次或多次递归调用其自身来解决的子问题.这些算法通常采用分治策略:将原问题划分为n个规模较小而结构与原问题相似的子问题:递归地解决这些子问题,然后再合并其结果,就得到原问题的解. 二.分治算法的三个步骤 分治模式在每一层递归上都有三个步骤: 分解(Divide)步骤将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小. 解决(Conquer)步骤递归地求解出子问题.如果子问题规模足够小,则停止递归,直接求解. 合并(Co

南邮算法分析与设计实验1 分治策略

分治策略 实验目的: 理解分治法的算法思想,阅读实现书上已有的部分程序代码并完善程序,加深对分治法的算法原理及实现过程的理解. 实验内容: 用分治法实现一组无序序列的两路合并排序和快速排序.要求清楚合并排序及快速排序的基本原理,编程实现分别用这两种方法将输入的一组无序序列排序为有序序列后输出. 代码: #include <iostream> #include <cstdlib> #include <ctime> using namespace std; void Swa

算法复习_分治算法之二分搜索、棋盘覆盖、快速排序

一.基本概念 分治法,顾名思义,即分而治之的算法,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…… 二.基本思想及策略 设计思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之. 策略:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解.这种算法设计策略叫做分治法. 三

分治策略 - 最大子序列问题

自开始学习算法起,我感觉就是跪着把<算法导论>的代码看一遍.理解一遍然后敲一遍...说实话自己来写并且要求时间复杂度达到要求,我肯定是不能做到的,但我想前辈们辛苦积累的研究成果贡献出来也是为了让后人少走一些弯路,所以我的作用就是把前辈们的成果学习之后加以理解,然后积累经验,领悟到他们解决问题时的思路和灵感.还有就是把个人理解后的知识存储在不会忘记的地方作为复习备用... 当然什么是写博客呢,我个人认为是把所学的知识加上自己的理解然后用较为通俗的语言来解释一遍,至少这样才有可能把学到的东西变为自

【从零学习经典算法系列】分治策略实例——二分查找

1.二分查找算法简介 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法.搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组 为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半.折半搜索每次把搜索区域减少一半,时间复杂度为Ο(logn). 二分查找的优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且

第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)

/** * 最大子数组的暴力求解算法,复杂度为o(n2) * @param n * @return */ static MaxSubarray findMaxSubarraySlower(int[] n) { long tempSum = 0; int left = 0; int right = 0; long sum = Long.MIN_VALUE; for (int i = 0; i < n.length; i++) { for (int j = i; j < n.length; j++

第四章 分治策略 4.1 最大子数组问题 (减治法,别人的,拿来看看)

/** * 获得连续子数组的最大和 * * @author dfeng * */ private static long getMax(long a, long b) { return a > b ? a : b; } /** * 获得连续子数组的最大和 * * @param array * @return 最大和,此处用了Long型是为了表示当参数为null或空时,可以返回null,返回其它任何数字都可能引起歧义. */ public static Long getMax(int[] arra