算法 - 折半查找(C#)

  • 递归实现:

[csharp]  view plain  copy
 print ?
  1. // --------------------------------------------------------------------------------------------------------------------  
  2. //   
  3. // Respect the work.  
  4. //   
  5. //   
  6. // The binary search (recursive).  
  7. // [折半查找的前提]:  
  8. // 1、待查找序列必须采用顺序存储结构。  
  9. // 2、待查找序列必须是按关键字大小有序排列。  
  10. //   
  11. // --------------------------------------------------------------------------------------------------------------------  
  12.   
  13. namespace CSharpLearning  
  14. {  
  15.     using System;  
  16.   
  17.     ///   
  18.     /// The program.  
  19.     ///   
  20.     internal class Program  
  21.     {  
  22.         ///   
  23.         /// Entry point into console application.  
  24.         ///   
  25.         public static void Main()  
  26.         {  
  27.             int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  28.             Console.WriteLine(BinarySearch(a, 6, 0, 9));  
  29.         }  
  30.   
  31.         ///   
  32.         /// 在下界为low,上界为high的有序数组a中折半查找数据元素x(递归查找)。  
  33.         ///   
  34.         ///   
  35.         /// 待查找数组。  
  36.         ///   
  37.         ///   
  38.         /// 目标元素。  
  39.         ///   
  40.         ///   
  41.         /// 数组元素下标的下界。  
  42.         ///   
  43.         ///   
  44.         /// 数组元素下标的上界。  
  45.         ///   
  46.         ///   
  47.         /// 若查找到目标元素则返回该目标元素在数组中的下标;否则返回-1。  
  48.         ///   
  49.         private static int BinarySearch(int[] a, int x, int low, int high)  
  50.         {  
  51.             if (low > high)  
  52.             {  
  53.                 return -1;  
  54.             }  
  55.   
  56.             int mid = (low + high) / 2;  
  57.             if (x == a[mid])  
  58.             {  
  59.                 return mid;  
  60.             }  
  61.   
  62.             return x < a[mid] ? BinarySearch(a, x, low, mid - 1) : BinarySearch(a, x, mid + 1, high);  
  63.         }  
  64.     }  
  65. }  
  66.   
  67. // Output:  
  68. /* 
  69. 5 
  70. */  
时间复杂度:O(log2n)

  • 非递归实现:

[csharp]  view plain  copy
 print ?
  1. // --------------------------------------------------------------------------------------------------------------------  
  2. //   
  3. // Respect the work.  
  4. //   
  5. //   
  6. // The binary search (not recursive).  
  7. // [折半查找的前提]:  
  8. // 1、待查找序列必须采用顺序存储结构。  
  9. // 2、待查找序列必须是按关键字大小有序排列。  
  10. //   
  11. // --------------------------------------------------------------------------------------------------------------------  
  12.   
  13. namespace CSharpLearning  
  14. {  
  15.     using System;  
  16.   
  17.     ///   
  18.     /// The program.  
  19.     ///   
  20.     internal class Program  
  21.     {  
  22.         ///   
  23.         /// Entry point into console application.  
  24.         ///   
  25.         public static void Main()  
  26.         {  
  27.             int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
  28.             Console.WriteLine(BinarySearch(a, 6, 9));  
  29.         }  
  30.   
  31.         ///   
  32.         /// 在长度为n的有序数组a中查找值为key的元素(非递归查找)。  
  33.         ///   
  34.         ///   
  35.         /// 待查找数组。  
  36.         ///   
  37.         ///   
  38.         /// 目标元素。  
  39.         ///   
  40.         ///   
  41.         /// 数组长度。  
  42.         ///   
  43.         ///   
  44.         /// 若查找到目标元素则返回该目标元素在数组中的下标;否则返回-1。  
  45.         ///   
  46.         private static int BinarySearch(int[] a, int key, int n)  
  47.         {  
  48.             int low = 0;  
  49.             int high = n - 1;  
  50.             while (low <= high)  
  51.             {  
  52.                 int mid = (low + high) / 2;  
  53.                 if (a[mid] == key)  
  54.                 {  
  55.                     return mid;  
  56.                 }  
  57.   
  58.                 if (a[mid] < key)  
  59.                 {  
  60.                     low = mid + 1;  
  61.                 }  
  62.                 else  
  63.                 {  
  64.                     high = mid - 1;  
  65.                 }  
  66.             }  
  67.   
  68.             return -1;  
  69.         }  
  70.     }  
  71. }  
  72.   
  73. // Output:  
  74. /* 
  75. 5 
  76. */  

时间复杂度:O(log2n)

转自:http://blog.csdn.net/troubleshooter/article/details/4621272

你可能感兴趣的:(C#,算法)