博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分查找算法的实现-分治策略
阅读量:5870 次
发布时间:2019-06-19

本文共 1542 字,大约阅读时间需要 5 分钟。

所谓分治策略,就是把规模大的问题分成若干个规模小的问题来解决,最后把各自的结果再合并。

它的一般的算法设计模式如下:  

Divide-and-conquer(P)   

1. if |P|≤n0   

2. then return(ADHOc(P))   

3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk   

4. for i←1 to k   

5. do yi ← Divide-and-conquer(Pi) △ 递归解决Pi   

6. T ← MERGE(y1,y2,...,yk) △ 合并子问题   

7. return(T)

 
当然,有时候也不一定需要合并各个子问题的结果。
分治策略的典型应用就是二分查找,也叫折半查找。算法的思想就是对一个有序的数组查找,搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

 
下面的代码实现了c#版本的二分查找。

 

 
  1. public class Program  
  2.     {  
  3.         static int x = 30;  
  4.         static void Main(string[] args)  
  5.         {  
  6.             int[] array = {1,2,3,4,5,6,7,8,9,10,20,30,60,100,110};  
  7.  
  8.             binarysearch(array, 0, array.Length - 1);  
  9.         }  
  10.  
  11.         static int binarysearch(int[] array, int start, int end)  
  12.         {  
  13.             if (end - start <= 1)//如果二分下来只剩下1个,或2个元素。  
  14.             {  
  15.                 if (array[end] == x)  
  16.                 {  
  17.                     Console.WriteLine("找到{0},位置{1}", x, end);  
  18.                     return end;  
  19.                 }  
  20.                 else if (array[start] == x)  
  21.                 {  
  22.                     Console.WriteLine("找到{0},位置{1}", x, start);  
  23.                     return start;  
  24.                 }  
  25.                 else 
  26.                 {  
  27.                     Console.WriteLine("未找到{0}", x);  
  28.                     return -1;  
  29.                 }  
  30.  
  31.             }  
  32.  
  33.             int middle = (start + end) / 2;  
  34.             Console.WriteLine("在下列有序数列中查找");  
  35.             for (int i = start; i <= end; i++)  
  36.             {  
  37.                 Console.Write(array[i] + " ");  
  38.             }  
  39.             Console.WriteLine();  
  40.             Console.WriteLine("middle=({0}+{1})/2={2}", start, end, middle);  
  41.             Console.WriteLine();  
  42.  
  43.  
  44.  
  45.             if (array[middle] == x)  
  46.             {  
  47.                 Console.WriteLine("找到{0},位置{1}", x, middle);  
  48.                 return middle;  
  49.             }  
  50.             else if (array[middle] < x)  
  51.             {  
  52.                 start = middle;  
  53.                 return binarysearch(array, start, end);  
  54.             }  
  55.             else 
  56.             {  
  57.                 end = middle;  
  58.                 return binarysearch(array, start, end);  
  59.             }  
  60.         }  
  61.  
  62.     } 

 

本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/858556,如需转载请自行联系原作者

你可能感兴趣的文章
文件缓存
查看>>
远程协助
查看>>
Scrum实施日记 - 一切从零开始
查看>>
关于存储过程实例
查看>>
配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
查看>>
AIX 7.1 install python
查看>>
PHP盛宴——经常使用函数集锦
查看>>
重写 Ext.form.field 扩展功能
查看>>
Linux下的搜索查找命令的详解(locate)
查看>>
福利丨所有AI安全的讲座里,这可能是最实用的一场
查看>>
开发完第一版前端性能监控系统后的总结(无代码)
查看>>
Python多版本情况下四种快速进入交互式命令行的操作技巧
查看>>
MySQL查询优化
查看>>
【Redis源码分析】如何在Redis中查找大key
查看>>
northropgrumman
查看>>
关于链接文件的探讨
查看>>
android app启动过程(转)
查看>>
Linux—源码包安装
查看>>
JDK8中ArrayList的工作原理剖析
查看>>
安装gulp及相关插件
查看>>