C#二分查找算法設計實現
1.介紹
二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序存儲結構,而且表中元素按關鍵字有序排列。(記住了前提要求是順序存儲結構,而且要有序排序,所以說對於一個無序的是沒法用二分查找的)
2.查找算法過程
舉例就一個int類型數組為例 比如int[] intArray;
假設數組中元素是按升序排列,將數組中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找后一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。
復雜度:O(lg n),n為要查找的元素個數。
3.算法要求
- 必須采用順序存儲結構。
- 必須按關鍵字大小有序排列。
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.源代碼工程下載
源碼工程項目文件下載