二分查找算法的实现-分治策略

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

它的一般的算法设计模式如下:   
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.     } 

 

你可能感兴趣的:(二分查找,分治法)