C#二分查找算法設計實現

C#二分查找算法設計實現

1.介紹

二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。可是,折半查找要求線性表必須採用順序存儲結構,並且表中元素按關鍵字有序排列。(記住了前提要求是順序存儲結構,並且要有序排序,因此說對於一個無序的是無法用二分查找的)算法

2.查找算法過程

舉例就一個int類型數組爲例 好比int[] intArray;數組

假設數組中元素是按升序排列,將數組中間位置記錄的關鍵字與查找關鍵字比較,若是二者相等,則查找成功;不然利用中間位置記錄將表分紅前、後兩個子表,若是中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,不然進一步查找後一子表。重複以上過程,直到找到知足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。測試

複雜度:O(lg n),n爲要查找的元素個數。spa

3.算法要求

  1. 必須採用順序存儲結構。
  2. 必須按關鍵字大小有序排列。

4.算法實現

這裏以C#代碼實現  設計

4.1遞歸方法

 1         /// <summary>
 2         /// 二分查找遞歸實現
 3         /// </summary>
 4         /// <param name="arr">數組</param>
 5         /// <param name="low">開始索引 0</param>
 6         /// <param name="high">結束索引 </param>
 7         /// <param name="key">要查找的對象</param>
 8         /// <returns>返回索引</returns>
 9         public static int BinarySearch(int[] arr, int low, int high, int key)
10         {
11             int mid = (low + high) / 2;//中間索引
12             if (low > high)
13                 return -1;
14             else
15             {
16                 if (arr[mid] == key)
17                     return mid;
18                 else if (arr[mid] > key)
19                     return BinarySearch(arr, low, mid - 1, key);
20                 else
21                     return BinarySearch(arr, mid + 1, high, key);
22             }
23         }

4.2While循環實現

 1         /// <summary>
 2         /// 二分查找While循環實現
 3         /// </summary>
 4         /// <param name="nums">數組</param>
 5         /// <param name="low">開始索引</param>
 6         /// <param name="high">結束索引</param>
 7         /// <param name="target">要查找的對象</param>
 8         /// <returns>返回索引</returns>
 9         public static int BinaryWhile(int[] nums, int low, int high, int target)
10         {
11             while (low <= high)
12             {
13                 int middle = (low + high) / 2;
14                 if (target == nums[middle])
15                 {
16                     return middle;
17                 }
18                 else if (target > nums[middle])
19                 {
20                     low = middle + 1;
21                 }
22                 else if (target < nums[middle])
23                 {
24                     high = middle - 1;
25                 }
26             }
27             return -1;
28         }

5.測試代碼

 1         static void Main(string[] args)
 2         {
 3             int[] intArray = new int[] { 1,2,3,4,5,6,7,8,9,10};
 4             int result = BinarySearch(intArray,0,intArray.Length-1,5);
 5             Console.WriteLine(result.ToString());
 6             Console.WriteLine("-------------------------------------------");
 7             int resuleWhile = BinaryWhile(intArray,0,intArray.Length-1,5);
 8             Console.WriteLine(resuleWhile.ToString());
 9             Console.Read();
10         }

6.輸出結果

7.源代碼工程下載

源碼工程項目文件下載

相關文章
相關標籤/搜索